如何在Windows CMD的一行中运行两个命令?


957

我想在Windows CMD控制台中运行两个命令。

在Linux中,我会这样

touch thisfile ; ls -lstrh

在Windows上如何完成?

Answers:


1316

自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

26
至少下降到新台币
Joey

17
同样适用于Win 8.0和8.1。
MEMark 2013年

5
@Fallenreaper,它也可以在直接cmd提示中起作用,所以我认为进入它不是一个坏习惯。:)

6
@Fallenreaper确保您了解两者之间的实际区别:请参阅下面的Raihan答案。
Moshe Katz 2014年

8
被我耍到了。A && B,B仅在A成功的情况下运行,而A和B将在A之后运行B,无论A的结果如何。感谢您的抬头
Fallenreaper

578

来自文档的报价:

使用多个命令和条件处理符号

您可以使用条件处理符号从单个命令行或脚本运行多个命令。当您使用条件处理符号运行多个命令时,条件处理符号右侧的命令将根据条件处理符号左侧的命令结果起作用。

例如,您可能只想在前一个命令失败时才运行命令。或者,您可能只想在上一个命令成功的情况下运行命令。

您可以使用下表中列出的特殊字符来传递多个命令。

  • & [...]
    command1 & command2
    用于在一个命令行上分隔多个命令。Cmd.exe运行第一个命令,然后运行第二个命令。

  • && [...]
    command1 && command2
    仅当符号前面的命令成功时,才用于在&&之后运行命令。Cmd.exe运行第一个命令,然后仅在第一个命令成功完成后才运行第二个命令。

  • || [...]
    command1 || command2
    用于运行以下命令|| 仅当||之前的命令 失败。Cmd.exe运行第一个命令,然后仅在第一个命令未成功完成(接收到大于零的错误代码)的情况下运行第二个命令。

  • ( ) [...]
    (command1 & command2)
    用于分组或嵌套多个命令。

  • ; or ,
    command1 parameter1;parameter2
    用于分隔命令参数。


41
尝试cmd /c "echo foo & echo bar"
Raihan

2
vagrant up && vagrant ssh不带引号的工作在Windows 10
furman87

谢谢!我不了解singe- &使它异步并同时运行。我被困住是因为我使用的&&with是同步的,并且只有在第一个成功的情况下才继续!
TetraDev '16

1
文档链接已断开,新位置technet.microsoft.com/zh-cn/library/bb490954.aspx
nkef

7
@TetraDev &不会使命令异步或并行。command1 & command2command2 command1完成运行。的成功或失败command1无关紧要。
出生

74

&是Bash等效项;(运行命令),&&是Bash等效项&&(仅当前一个命令没有引起错误时才运行命令)。


1
对于csh,tcsh和许多其他shell也是如此。我从未;在Linux上见过
phuclv

10
在sh样式的shell中,@LưuVĩnhPhúc ;意味着运行第一个命令,等待其完成,然后运行第二个命令。&表示要运行第一个命令,将其置于后台,然后运行第二个命令。因此,这两个程序同时启动。注意,这些不是组合符号,它们是第一个命令的结尾符号。您可以在后台启动单个命令,progname &而无需第二个命令。
MM


19

如果要创建cmd快捷方式(例如在您的桌面上),请添加/ k参数(/ k表示保留,/ c将关闭窗口):

cmd /k echo hello && cd c:\ && cd Windows

16

您可以使用call来解决环境变量评估过早的问题-例如

set A=Hello & call echo %A%

1
仅当尚未设置变量时才有效,在这种情况下,将echo打印出值,而不是新值。至少,这是我在Windows 7机器上观察到的。
Craig M. Brandenburg

我首先使用set A =来确保未设置变量。
SSi

1
更好的方法是使用延迟扩展(setlocal EnableDelayedExpansion在或中cmd /v)。例如:timeout 5 && cmd /v /c echo !TIME! && echo %TIME%
尼克

5
在第一个百分比之后使用^获取新值:设置A = Hello并调用echo%^ A%
Nicolas

9

在同一行上运行多个命令时,可以使用许多处理符号,在某些情况下可能导致处理重定向,在其他情况下可能会更改输出,或者甚至会失败。一种重要的情况是在同一行上放置用于操作变量的命令。

@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!%"
sactiw

8

cmd /c ipconfig /all & Output.txt

该命令执行命令并Output.txt在单个命令中打开文件


8

因此,我试图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"

现在,我有了一个不错的右键单击菜单来注册一个程序集。



4

为了同时执行两个命令,必须在两个命令之间放置一个&(&)符号。像这样:

color 0a & start chrome.exe

干杯!


4

我尝试在同一窗口中执行两次ping操作,这是同一行上的串行命令。完成第一个命令后,运行第二个命令。

解决方案是start /b在Windows 7命令提示符下结合使用。

照常启动,不带/b,然后在单独的窗口中启动。

在同一行中启动的命令是:

start /b command1 parameters & command2 parameters

无论如何,如果您想解析输出,我不建议使用此方法。我注意到输出在命令的输出之间是混乱的。


4

好吧,您有两个选择:管道连接,或者&

DIR /S & START FILE.TXT

要么,

tasklist | find "notepad.exe"

管道(|)更多用于获取一个命令的输出,然后将其放入另一个命令。和(&)只是说运行该内容。


您能否编辑您的帖子以包含一些解释,它们的作用&|作用以及它们之间的不同之处(如果有的话)?目前,不熟悉这些概念的人无法自行决定在其案例中应使用哪种概念。
MirekDługosz'17

就像我以前那样。我的错。我将立即编辑该帖子。欣赏它。
PyDever

应该是“ findstr”而不是“ find”
Anu Shibin Joseph Raj

2

没有,cd / && tree && echo %time%。回显的时间是执行第一个命令时的时间。

管道存在一些问题,但是只要人们知道其工作原理,它就并不重要。


1

再举一个例子:例如,当我们使用gulp构建系统时,

gulp -默认>构建

gulp build -构建构建文件夹

gulp watch -开始文件监视

gulp dist -建立dist文件夹

我们可以用一行来做到这一点:

cd c:\xampp\htdocs\project & gulp & gulp watch

1

当您尝试在一行中使用或操作变量时,请注意其内容!例如,如下所示的变量

PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;

如果您将其用作以下产品,可能会导致很多难以处理的麻烦 %PATH%

  1. 右括号会终止您的组语句
  2. 双引号不允许您%PATH%用来处理括号问题
  3. 像这样的引用变量将%USERPROFILE%包含什么?

2
这与在Windows CMD中一行运行两个命令有什么关系?
彼得·莫滕森


0

&在Windows中使用符号在一行中使用命令

C:\Users\Arshdeep Singh>cd Desktop\PROJECTS\PYTHON\programiz & jupyter notebook

就像我们使用的linux

touch thisfile ; ls -lstrh

-2

很简单:只需用&&符号区分它们即可。例:

echo "Hello World" && echo "GoodBye World".

“ Hello World”之后将印刷“ Goodbye World”。


6
独立于事实,已经有旧的答案显示相同的事实,它仍然不是很正确。&&条件运算符,仅当第一个命令成功执行(错误级别= 0)时,才会执行下一个命令
jeb

当然。很明显,如果该人想执行两个命令,那么这两个命令将是正确的,因此一切都会顺利进行
Rajan Dhanowa

1
拉詹(Rajan):他的意思是“只有在第一个命令成功后才执行下一个命令”。
伊万(Ivan)

2
再见世界将世界您好后印刷 ”提供印刷Hello World没有失败。正如@jeb所说,这&&是有条件的。&运行命令,而不管先前的命令是否成功。
Pranav A.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.