Answers:
自2000年以来,在所有Microsoft操作系统上都采用这种格式,并且在今天仍然不错:
dir & echo foo
如果要仅在第一个命令成功退出时才执行第二个命令:
dir && echo foo
在一行上执行多个命令的单一&语法可追溯到Windows XP,Windows 2000和某些早期的NT版本。(根据一位评论者的说法,至少为4.0。)
向下滚动此页面还有很多其他要点。
历史数据如下,对于那些可能会觉得很有教育意义的人。
在此之前,&&语法只是外壳替换4DOS的一项功能,在将该功能添加到Microsoft命令解释器之前。
在Windows 95、98和ME中,您将改为使用竖线字符:
dir | echo foo
在MS-DOS 5.0和更高版本中,通过某些较早的Windows和NT版本的命令解释器,(未记录)命令分隔符为字符20(Ctrl + T),在此将用^ T表示。
dir ^T echo foo
来自文档的报价:
使用多个命令和条件处理符号
您可以使用条件处理符号从单个命令行或脚本运行多个命令。当您使用条件处理符号运行多个命令时,条件处理符号右侧的命令将根据条件处理符号左侧的命令结果起作用。
例如,您可能只想在前一个命令失败时才运行命令。或者,您可能只想在上一个命令成功的情况下运行命令。
您可以使用下表中列出的特殊字符来传递多个命令。
& [...]
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
&
使它异步并同时运行。我被困住是因为我使用的&&
with是同步的,并且只有在第一个成功的情况下才继续!
&
不会使命令异步或并行。command1 & command2
将command2
在 command1
完成后运行。的成功或失败command1
无关紧要。
如果要创建cmd快捷方式(例如在您的桌面上),请添加/ k参数(/ k表示保留,/ c将关闭窗口):
cmd /k echo hello && cd c:\ && cd Windows
您可以使用call来解决环境变量评估过早的问题-例如
set A=Hello & call echo %A%
echo
打印出旧值,而不是新值。至少,这是我在Windows 7机器上观察到的。
setlocal EnableDelayedExpansion
在或中cmd /v
)。例如:timeout 5 && cmd /v /c echo !TIME! && echo %TIME%
。
在同一行上运行多个命令时,可以使用许多处理符号,在某些情况下可能导致处理重定向,在其他情况下可能会更改输出,或者甚至会失败。一种重要的情况是在同一行上放置用于操作变量的命令。
@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!%"
因此,我试图RegAsm
从上下文菜单启用运行(注册程序集)的特定任务。我遇到的问题是结果会闪烁并消失,然后我才能阅读。因此,我尝试了管道到Pause
,当命令失败时该管道不起作用(如此处所述,暂停命令在.bat脚本中不起作用,而批处理文件命令PAUSE则不起作用)。因此,我尝试了一下,cmd /k
但是让窗口打开了更多命令(我只想读取结果)。因此,我在链中添加了一个pause
后跟exit
,结果如下:
cmd /k C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "%1" /codebase \"%1\" & pause & exit
这就像一个超级按钮-RegAsm在文件上运行并显示结果,然后显示“按任意键继续...”提示,然后在按下键时关闭命令提示符窗口。
PS对于其他可能感兴趣的人,可以使用以下.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"
现在,我有了一个不错的右键单击菜单来注册一个程序集。
好吧,您有两个选择:管道连接,或者&
:
DIR /S & START FILE.TXT
要么,
tasklist | find "notepad.exe"
管道(|
)更多用于获取一个命令的输出,然后将其放入另一个命令。和(&
)只是说运行该内容。
&
和|
作用以及它们之间的不同之处(如果有的话)?目前,不熟悉这些概念的人无法自行决定在其案例中应使用哪种概念。
没有,cd / && tree && echo %time%
。回显的时间是执行第一个命令时的时间。
管道存在一些问题,但是只要人们知道其工作原理,它就并不重要。
就在这里。是&
。
&&
如果命令1没有失败,它将在命令2完成时执行命令2。
&
不管执行。
很简单:只需用&&
符号区分它们即可。例:
echo "Hello World" && echo "GoodBye World".
“ Hello World”之后将印刷“ Goodbye World”。
&&
是条件运算符,仅当第一个命令成功执行(错误级别= 0)时,才会执行下一个命令
Hello World
没有失败。正如@jeb所说,这&&
是有条件的。&
运行命令,而不管先前的命令是否成功。