我想在Windows CMD控制台中运行两个命令。
在Linux中,我会这样做
touch thisfile ; ls -lstrh
它是如何在Windows上完成的?
像这样在2000年以来的所有Microsoft操作系统上,今天仍然很好:
dir & echo foo
如果您希望第二个命令仅在第一个命令成功退出时执行:
dir && echo foo
在一行上执行多个命令的单个&符号(&)语法可以追溯到Windows XP,Windows 2000和一些早期的NT版本。 (至少4.0,据一位评论者说。)
关于这一点还有很多其他要点,你会发现在这个页面上向下滚动。
随后的历史数据,对于那些可能发现它具有教育意义
在此之前,在将该功能添加到Microsoft命令解释程序之前,&&语法只是shell替换4DOS的一个功能。
在Windows 95,98和ME中,您将使用管道字符:
dir | echo foo
在MS-DOS 5.0及更高版本中,通过一些早期的Windows和NT版本的命令解释器,(未记录的)命令分隔符是字符20(Ctrl + T),我将在这里用^ T表示。
dir ^T echo foo
为了同时执行两个命令,必须在两个命令之间放置一个&(和号)符号。像这样:
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"
管道(|
)更多的是用于获取一个命令的输出,并将其放入另一个命令。并且(&
)只是说运行这个,那个。
不,cd / && tree && echo %time%
。回显的时间是第一个命令执行的时间。
管道有一些问题,但只要人们知道它是如何工作的,它就不重要了。
这很简单:只需用&&符号区分它们。例:
echo Hello World && echo GoodBye World
再见世界将在Hello World之后打印。
还有一个例子:例如,当我们使用gulp
构建系统时,而不是
gulp
- 默认>构建
gulp build
- 构建build-folder
gulp watch
- 启动文件监视
gulp dist
- 构建dist文件夹
我们可以用一行来做到这一点:
cd c:\xampp\htdocs\project & gulp & gulp watch
当您尝试在一行中使用或操作变量时要小心其内容!例如。一个如下变量
PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
如果你用它作为%PATH%
,可能会导致许多无法解决的麻烦
%PATH%
来处理括号问题%USERPROFILE%
这样的引用变量包含什么?就在这里。它的 &。
&&将在命令1完成时执行命令2,前提是它没有失败。
&将执行无论如何。
文件引用:
使用多个命令和条件处理符号
您可以使用条件处理符号从单个命令行或脚本运行多个命令。当您使用条件处理符号运行多个命令时,条件处理符号右侧的命令将根据条件处理符号左侧的命令结果进行操作。
例如,您可能只想在上一个命令失败时运行命令。或者,您可能只想在上一个命令成功时运行命令。
您可以使用下表中列出的特殊字符来传递多个命令。
& [...]
command1 & command2
用于在一个命令行上分隔多个命令。 Cmd.exe运行第一个命令,然后运行第二个命令。&& [...]
command1 && command2
用于仅在符号前面的命令成功时运行&&后面的命令。 Cmd.exe运行第一个命令,然后仅在第一个命令成功完成时运行第二个命令。|| [...]
command1 || command2
用于在||后面运行命令只有前面的命令是||失败。 Cmd.exe运行第一个命令,然后仅在第一个命令未成功完成时才运行第二个命令(接收大于零的错误代码)。( ) [...]
(command1 & command2)
用于分组或嵌套多个命令。; or ,
command1 parameter1;parameter2
用于分隔命令参数。
&
是;
(运行命令)的Bash等价物,&&
是&&
的Bash等价物(仅当前一个没有引起错误时才运行命令)。
您可以使用&一个接一个地运行命令。示例:c:\dir & vim myFile.txt
如果要创建cmd快捷方式(例如在桌面上)添加/ k参数(/ k表示保持,/ c将关闭窗口):
cmd /k echo hello && cd c:\ && cd Windows
您可以使用调用来克服过早评估环境变量的问题 - 例如
set A=Hello & call echo %A%
所以,我试图从上下文菜单启用运行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"
现在我有一个很好的右键菜单来注册一个程序集。
在同一行上运行多个命令时可以使用多个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 /c ipconfig /all & Output.txt
此命令执行命令并在单个命令中打开Output.txt
文件