【发布时间】:2011-12-24 17:13:20
【问题描述】:
我想在 Windows CMD 控制台中运行两个命令。
在 Linux 中我会这样做
touch thisfile ; ls -lstrh
如何在 Windows 上完成?
【问题讨论】:
标签: windows batch-file command-line cmd
我想在 Windows CMD 控制台中运行两个命令。
在 Linux 中我会这样做
touch thisfile ; ls -lstrh
如何在 Windows 上完成?
【问题讨论】:
标签: windows batch-file command-line cmd
自 2000 年以来在所有 Microsoft 操作系统上都采用这种方式,并且今天仍然很好:
dir & echo foo
如果您希望仅在第一个命令成功退出时执行第二个命令:
dir && echo foo
在一行上执行多个命令的单与号 (&) 语法可以追溯到 Windows XP、Windows 2000 和一些早期的 NT 版本。 (至少 4.0,据这里的一位评论者说。)
向下滚动此页面,您会发现很多其他要点。
以下是历史数据,供那些可能觉得具有教育意义的人参考。
在此之前,&& 语法只是 shell 替换 4DOS 的一个特性,然后该特性才被添加到 Microsoft 命令解释器中。
在 Windows 95、98 和 ME 中,您可以改用竖线字符:
dir | echo foo
在 MS-DOS 5.0 和更高版本中,通过一些较早的 Windows 和 NT 版本的命令解释器,(未记录的)命令分隔符是字符 20 (Ctrl+T),我将在此处用 ^T 表示。
dir ^T echo foo
【讨论】:
cmd 提示符下也有效,所以我想养成这个习惯并不是一个坏习惯。 :)
echo %myvar% 将作为echo OldValueOfMyVar 运行。这个问题可以通过使用延迟扩展功能来解决(虽然仅在批处理文件中可用)。因此,请在批处理文件中尝试以下操作:setlocal EnableDelayedExpansion && set MyVar=MyVal && echo !MyVar! && endlocal。 (注意:该功能要求您使用! 标记代替% 符号。
您可以使用 & 来一个接一个地运行命令。示例:c:\dir & vim myFile.txt
【讨论】:
引用自文档:
使用多个命令和条件处理符号
您可以使用条件处理符号从单个命令行或脚本运行多个命令。当您使用条件处理符号运行多个命令时,条件处理符号右侧的命令将根据条件处理符号左侧命令的结果进行操作。
例如,您可能希望仅在前一个命令失败时才运行命令。或者,您可能希望仅在前一个命令成功时才运行命令。
您可以使用下表中列出的特殊字符来传递多个命令。
& [...]command1 & command2
用于在一个命令行上分隔多个命令。 Cmd.exe 运行第一个命令,然后运行第二个命令。
&& [...]command1 && command2
仅当符号前面的命令成功时才用于运行 && 后面的命令。 Cmd.exe 运行第一个命令,然后仅当第一个命令成功完成时才运行第二个命令。
|| [...]command1 || command2
用于运行 || 后面的命令仅当 || 前面的命令失败。 Cmd.exe 运行第一个命令,然后仅在第一个命令未成功完成时运行第二个命令(收到大于零的错误代码)。
( ) [...](command1 & command2)
用于对多个命令进行分组或嵌套。
; or ,command1 parameter1;parameter2
用于分隔命令参数。
【讨论】:
cmd /c "echo foo & echo bar"。
vagrant up && vagrant ssh 在 Windows 10 上没有引号。
& - 使其异步并并行运行。我被卡住了,因为我使用 && 是同步的,只有在第一次成功时才会继续!
& 不会使命令异步或并行。 command1 & command2 将在 command2 command1 完成后运行。 command1的成败无关紧要。
& 是 ;(运行命令)的 Bash 等效项,&& 是 && 的 Bash 等效项(仅在前一个未导致错误时运行命令)。
【讨论】:
;
; 表示运行第一个命令,等待它完成,然后运行第二个命令。 & 表示运行第一个命令,将其置于后台,然后运行第二个命令。所以两个程序同时启动。请注意,这些不是组合符号,它们是第一个命令的尾随符号;您可以在后台使用progname & 启动单个命令,而无需第二个命令。
如果要创建cmd快捷方式(例如在桌面上)添加/k参数(/k表示保留,/c将关闭窗口):
cmd /k echo hello && cd c:\ && cd Windows
【讨论】:
cmd /c ipconfig /all & Output.txt
此命令执行命令并在单个命令中打开Output.txt 文件
【讨论】:
所以,我试图从上下文菜单启用运行RegAsm(注册程序集)的特定任务。我遇到的问题是结果会在我阅读之前闪现并消失。所以我尝试通过管道传递到Pause,当命令失败时它不起作用(如这里提到的Pause command not working in .bat script 和这里的Batch file command PAUSE does not work)。所以我尝试了cmd /k,但这让窗口打开了更多命令(我只想阅读结果)。所以我在链中添加了pause,后跟exit,结果如下:
cmd /k C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "%1" /codebase \"%1\" & pause & exit
这就像一个魅力 - RegAsm 在文件上运行并显示其结果,然后显示“按任意键继续...”提示,然后在按下某个键时关闭命令提示窗口。
附:对于其他可能感兴趣的人,您可以使用以下 .reg 文件条目将 dllfile 关联添加到 .dll 文件,然后为其添加 RegAsm 命令扩展名(注意转义的引号和反斜杠):
[HKEY_CLASSES_ROOT\.dll]
"Content Type"="application/x-msdownload"
@="dllfile"
[HKEY_CLASSES_ROOT\dllfile]
@="Application Extension"
[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm]
@="Register Assembly"
[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm\command]
@="cmd /k C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\regasm.exe \"%1\" /codebase \"%1\" & pause & exit"
现在我有一个不错的右键菜单来注册程序集。
【讨论】:
您可以使用 call 来克服环境变量被过早评估的问题 - 例如
set A=Hello & call echo %A%
【讨论】:
echo 会打印出 old 值,而不是新值。至少,这是我在 Windows 7 机器上观察到的。
setlocal EnableDelayedExpansion 或cmd /v)。例如:timeout 5 && cmd /v /c echo !TIME! && echo %TIME%.
set var=Hello & cmd /v /c echo firstUsage=!var! ^& echo secondUsage=!var!。使用 Nicolas 的解决方案,我应该在每个子命令之前重复 call:set var=Hello & call echo firstUsage=%^var% & call echo secondUsage=%^var%(可能知道如何改进)。
不,cd / && tree && echo %time%。回显的时间是执行第一个命令的时间。
管道有一些问题,但只要人们知道它是如何工作的,这并不重要。
【讨论】:
在同一行上运行多个命令时可以使用多个processing symbols,在某些情况下可能会导致处理重定向,在其他情况下会更改输出,或者只是失败。一种重要的情况是将操作变量的命令放在同一行。
@echo off
setlocal enabledelayedexpansion
set count=0
set "count=1" & echo %count% !count!
0 1
正如你在上面的例子中看到的,当使用变量的命令放在同一行时,你必须使用延迟扩展来更新你的变量值。如果您的变量已编入索引,请使用带有 %% 修饰符的 CALL 命令在同一行更新其值:
set "i=5" & set "arg!i!=MyFile!i!" & call echo path!i!=%temp%\%%arg!i!%%
path5=C:\Users\UserName\AppData\Local\Temp\MyFile5
【讨论】:
cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
为了同时执行两个命令,你必须在两个命令之间加上一个&(和号)符号。像这样:
color 0a & start chrome.exe
干杯!
【讨论】:
我尝试在同一个窗口中有两个 ping,它是同一行上的串行命令。完成第一个命令后,运行第二个命令。
解决方案是在 Windows 7 命令提示符下与 start /b 结合使用。
照常启动,不带/b,然后在单独的窗口中启动。
用于在同一行启动的命令是:
start /b command1 parameters & command2 parameters
无论如何,如果你想解析输出,我不推荐使用这个。 我注意到输出在命令的输出之间被打乱了。
【讨论】:
嗯,你有两个选择:管道,或者只是&:
DIR /S & START FILE.TXT
或者,
tasklist | find "notepad.exe"
管道(|)更多地用于获取一个命令的输出,并将其放入另一个命令。而且 (&) 只是说运行这个,那个。
【讨论】:
& 和 | 的作用以及它们有何不同(如果有的话)?现在,不熟悉这些概念的人无法自行决定在他们的案例中应该使用哪一个。
再举一个例子:例如,当我们使用gulp构建系统时,而不是
gulp - 默认 > 构建
gulp build - 构建构建文件夹
gulp watch - 开始文件监视
gulp dist - 构建 dist 文件夹
我们可以用一行来做到这一点:
cd c:\xampp\htdocs\project & gulp & gulp watch
【讨论】:
很简单:只需用&& 符号区分它们即可。
示例:
echo "Hello World" && echo "GoodBye World".
“再见世界”将在“Hello World”之后打印。
【讨论】:
&& 是一个条件操作符,只有当第一个命令成功时才会执行下一个命令(errorlevel=0)
Hello World 没有失败。正如@jeb 所说,&& 是有条件的。 & 运行命令,无论前面是否成功。
当您尝试在一行中使用或操作变量时,请注意它们的内容!例如。像下面这样的变量
PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
如果你把它当成%PATH%使用可能会导致很多无法解决的麻烦
%PATH% 处理括号问题%USERPROFILE% 这样的引用变量将包含什么?【讨论】:
是的,有。我是&。
&& 将在命令 1 完成时执行命令 2,前提是它没有失败。
& 无论如何都会执行。
【讨论】:
在windows中使用&符号在一行中使用命令
C:\Users\Arshdeep Singh>cd Desktop\PROJECTS\PYTHON\programiz & jupyter notebook
就像在linux中一样 我们使用,
touch thisfile ; ls -lstrh
【讨论】:
在 Windows 10 中,您还可以使用scriptrunner:
ScriptRunner.exe -appvscript demoA.cmd arg1 arg2 -appvscriptrunnerparameters -wait -timeout=30 -rollbackonerror -appvscript demoB.ps1 arg3 arg4 -appvscriptrunnerparameters -wait -timeout=30 -rollbackonerror
它允许您在一行上启动几个命令,您可以连续运行它们或不相互等待,您可以设置超时和回滚错误。
【讨论】:
在命令之间使用&&。
例如:cls && echo 'hello' && dir c:
【讨论】:
&&并不总是执行下一条命令,只有在第一条命令执行成功时才会执行