如何在Windows CMD中的一行中运行两个命令?
我想在Windows CMD控制台中运行两个命令。
在Linux中,我会这样做: touch thisfile ; ls -lstrh
touch thisfile ; ls -lstrh
。
它是如何在Windows上完成的?
从2000年开始,所有的微软操作系统都是如此,今天仍然不错:
dir & echo foo
如果你想要第二个命令只有在第一个成功退出时执行:
dir && echo foo
在同一行上执行多个命令的单符号(&)语法可以追溯到Windows XP,Windows 2000和一些早期的NT版本。 (至less4.0,根据一个评论者在这里。)
还有其他几点关于这个,你会发现滚动此页面。
历史数据如下,对于那些可能会发现它的教育。
在此之前,&&语法只是在将该function添加到Microsoft命令解释程序之前的shellreplace4DOS的function。
在Windows 95,98和ME中,您将使用pipe道字符:
dir | echo foo
在MS-DOS 5.0和更高版本中,通过某些较早的Windows和NT版本的命令解释程序,(未logging的)命令分隔符是字符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
用来分隔命令参数。
&
是Bash的等价物;
(运行命令), &&
是&&
的Bash等同物(只有当前一个没有导致错误时才运行命令)。
您可以使用&来一个接一个地运行命令。 例如: c:\dir & vim myFile.txt
如果你想创build一个cmd快捷方式(例如在你的桌面上)添加/ k参数(/ k意味着保持,/ c将closures窗口):
cmd /k echo hello && cd c:\ && cd Windows
你可以使用调用来克服环境variables太快评估的问题 – 例如
set A=Hello & call echo %A%
cmd /c ipconfig /all & Output.txt
该命令执行命令,并在一个命令中打开Output.txt
文件
在同一行上运行多个命令时,可能会使用多个处理符号 ,并可能导致在某些情况下处理redirect,在其他情况下更改输出,或者只是失败。 一个重要的情况是放在操作variables的相同的命令行上。
@echo off setlocal enabledelayedexpansion set count=0 set "count=1" & echo %count% !count! 0 1
正如你在上面的例子中看到的,当使用variables的命令放在同一行时,你必须使用延迟扩展来更新你的variables值。 如果您的variables已编入索引,请使用带%%修饰符的CALL命令在同一行上更新其值:
set "i=5" & set "arg!i!=MyFile!i!" & call echo path!i!=%temp%\%%arg!i!%% path5=C:\Users\UserName\AppData\Local\Temp\MyFile5
所以,我试图从上下文菜单中启用运行RegAsm
(寄存器汇编)的特定任务。 我所遇到的问题是,结果会在我读懂它之前闪现出来。 所以我试着用pipe道Pause
,当命令失败时不起作用(这里提到Pause命令不能在.bat脚本中工作 ,这里batch file命令PAUSE不起作用 )。 所以我尝试了cmd /k
但留下窗口打开更多的命令(我只想读取结果)。 所以我添加了一个pause
然后exit
链,导致以下结果:
cmd /k C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "%1" /codebase \"%1\" & pause & exit
这就像一个魅力 – RegAsm在文件上运行并显示其结果,然后显示“按任意键继续…”提示,然后当按下一个键时,命令提示窗口closures。
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"
现在我有一个很好的右键菜单来注册一个程序集。
为了同时执行两个命令,必须在两个命令之间放置一个&符号。 像这样:
color 0a & start chrome.exe
干杯!
我试着在同一个窗口中有两个ping,它是同一行上的串行命令。 在完成第一个之后,运行第二个命令。
解决scheme是在Windows 7命令提示符下与start /b
结合使用。
像往常一样开始,没有/b
,并启动在一个单独的窗口。
用于在同一行中启动的命令是:
start /b command1 parameters & command2 parameters
任何方式,如果你想parsing输出,我不build议使用这个。 我注意到输出在命令的输出之间是混乱的。
那么,你有两个select:pipe道,或只是&
:
DIR /S & START FILE.TXT
要么,
tasklist | find "notepad.exe"
pipe道( |
)更多的是用于输出一个命令,并把它放到另一个命令。 ( &
)只是说这个,那个。
不, cd / && tree && echo %time%
。 第一个命令执行时的回显时间。
pipe道有一些问题,但只要人们知道它是如何工作的并不重要。
很简单:用&&符号来区分它们。 例:
echo Hello World && echo GoodBye World
再见世界将在Hello World之后印刷。
再举一个例子:例如,当我们使用gulp
构build系统而不是
gulp
– 默认>构build
gulp build
– 构build生成文件夹
gulp watch
– 开始文件观看
gulp dist
– build立dist-folder
我们可以用一行来做到这一点:
cd c:\xampp\htdocs\project & gulp & gulp watch
当您尝试在一行中使用或操作variables时,请注意其内容! 例如像下面这样的variables
PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
可能会导致很多不可预料的麻烦,如果你使用它作为%PATH%
- 结束括号会终止您的小组声明
- 双引号不允许您使用
%PATH%
来处理括号问题 - 而像
%USERPROFILE%
这样的引用variables包含什么?