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

fly*_*ire 861 windows command-line cmd batch-file

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

在Linux中,我会这样做

touch thisfile ; ls -lstrh
Run Code Online (Sandbox Code Playgroud)

它是如何在Windows上完成的?

djd*_*lib 1183

像这样在2000年以来的所有Microsoft操作系统上,今天仍然很好:

dir & echo foo
Run Code Online (Sandbox Code Playgroud)

如果您希望第二个命令仅在第一个命令成功退出时执行:

dir && echo foo
Run Code Online (Sandbox Code Playgroud)

在一行上执行多个命令的单个&符号(&)语法可以追溯到Windows XP,Windows 2000和一些早期的NT版本.(至少4.0,据一位评论者说.)

关于这一点还有很多其他要点,你会发现在这个页面上向下滚动.

随后的历史数据,对于那些可能发现它具有教育意义

在此之前,在将该功能添加到Microsoft命令解释程序之前,&&语法只是shell替换4DOS的一项功能.

在Windows 95,98和ME中,您将使用管道字符:

dir | echo foo
Run Code Online (Sandbox Code Playgroud)

在MS-DOS 5.0及更高版本中,通过一些早期的Windows和NT版本的命令解释器,(未记录的)命令分隔符是字符20(Ctrl + T),我将在这里用^ T表示.

dir ^T echo foo
Run Code Online (Sandbox Code Playgroud)

  • 仅为了清楚起见:您应该注意这里的单个"&"符号是显式的实时命令提示符.当通过传递要作为脚本执行的字符串(快捷方式,批处理文件等)来运行命令时,则需要双重"&&". (160认同)
  • 至少降到NT 4. (26认同)
  • 适用于Win 8.0和8.1. (17认同)
  • @Fallenreaper确保您了解两者之间的实际区别:请参阅下面的Raihan的答案. (6认同)
  • 被我耍到了.A&B,B仅在A成功时运行,而A和B在A后运行B,无论A的结果如何.谢谢你的提醒 (6认同)
  • @Fallenreaper,也可以在直接的'cmd`提示下工作,所以我认为这不是一个坏习惯.:) (5认同)
  • @AlexD 或者使用双引号来避免杂散空格,如 `set "b=3" & ...` 中。 (3认同)
  • @infografnet这是一个不同的问题.运行这两个命令,但在实际执行任一命令之前评估环境变量替换.所以`echo%myvar%`将作为`echo OldValueOfMyVar`运行.使用延迟扩展功能可以解决此问题(仅在批处理文件中可用).所以在批处理文件中尝试以下内容:`setlocal EnableDelayedExpansion &&设置MyVar = MyVal && echo!MyVar!&& endlocal`.(注意:该功能要求您使用`!`标记代替`%`符号. (2认同)
  • 这也是一个小宝石......在同一行上使用变量赋值时,始终将“&”放在值之后,即没有空格或窗口会分配值加上空格(s)。`code` Bad as变量 b 将包含 "3 " set b=3 & echo "%b" 正确的方法是: set b=3& echo "%b" `​​code` 请注意,使用引号来显示值,将准确显示您的内容正在得到。 (2认同)

Rai*_*han 552

文件引用:

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

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

例如,您可能只想在上一个命令失败时运行命令.或者,您可能只想在上一个命令成功时运行命令.

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

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

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

  • || [...]
    command1 || command2
    用于在||后面运行命令 只有前面的命令是|| 失败.Cmd.exe运行第一个命令,然后仅在第一个命令未成功完成时才运行第二个命令(接收大于零的错误代码).

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

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

  • 试试`cmd/c"echo foo&echo bar"`. (40认同)
  • @TetraDev`&`不会使命令异步或并行.`command1&command2`将运行`command2` _after_`command1`已经完成."command1"的成功或失败是无关紧要的. (6认同)
  • 是的,这与引号有关! (3认同)
  • `vagrant up && vagrant ssh`在Windows 10上没有引号. (2认同)

man*_*lds 71

&;(运行命令)&&的Bash等价物,是Bash的等价物&&(仅当前一个没有引起错误时才运行命令).

  • @LưuVĩnhPhúc在sh-style shell中,`;`表示运行第一个命令,等待它完成,然后运行第二个命令.`&`表示运行第一个命令,将其置于后台,然后运行第二个命令.所以这两个程序同时启动.注意,这些不是组合符号,它们是第一个命令的尾随符号; 你可以使用`progname&`在后台启动一个命令而不需要第二个命令. (9认同)

scr*_*ola 24

您可以使用&一个接一个地运行命令.例:c:\dir & vim myFile.txt


Tro*_*ike 18

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

cmd /k echo hello && cd c:\ && cd Windows
Run Code Online (Sandbox Code Playgroud)


小智 14

您可以使用调用来克服过早评估环境变量的问题 - 例如

set A=Hello & call echo %A%
Run Code Online (Sandbox Code Playgroud)

  • 在第一个百分比之后使用^来获取新值:set A = Hello&call echo%^ A% (4认同)
  • 仅当变量尚未设置时才有效,在这种情况下,“echo”打印出_old_值,而不是新值。至少,这是我在 Windows 7 机器上观察到的情况。 (2认同)
  • 更好的方法是使用延迟扩展(脚本中的`setlocal EnableDelayedExpansion` 或`cmd /v`)。例如:`timeout 5 && cmd /v /c echo !TIME! && 回显 %TIME%`。 (2认同)

Vik*_*han 12

在Windows中,我使用了上述所有解决方案&, &&,但没有任何效果最后';'符号对我有用

npm install; npm start
Run Code Online (Sandbox Code Playgroud)


sam*_*l35 8

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

@echo off
setlocal enabledelayedexpansion
set count=0
set "count=1" & echo %count% !count!

0 1
Run Code Online (Sandbox Code Playgroud)

正如您在上面的示例中所看到的,当使用变量的命令放在同一行上时,您必须使用延迟扩展来更新变量值.如果您的变量已编制索引,请使用带有%%修饰符的CALL命令在同一行上更新其值:

set "i=5" & set "arg!i!=MyFile!i!" & call echo path!i!=%temp%\%%arg!i!%%

path5=C:\Users\UserName\AppData\Local\Temp\MyFile5
Run Code Online (Sandbox Code Playgroud)


小智 7

所以,我试图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"
Run Code Online (Sandbox Code Playgroud)

现在我有一个很好的右键菜单来注册一个程序集.


小智 6

cmd /c ipconfig /all & Output.txt

此命令Output.txt在单个命令中执行命令和打开文件


小智 6

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

C:\Users\Arshdeep Singh>cd Desktop\PROJECTS\PYTHON\programiz & jupyter notebook
Run Code Online (Sandbox Code Playgroud)

就像我们使用的linux一样,

touch thisfile ; ls -lstrh
Run Code Online (Sandbox Code Playgroud)


小智 5

好吧,你有两个选择:管道,或者只是&

DIR /S & START FILE.TXT
Run Code Online (Sandbox Code Playgroud)

或者,

tasklist | find "notepad.exe"
Run Code Online (Sandbox Code Playgroud)

管道 ( |) 更多用于获取一个命令的输出,并将其放入另一个命令。并且 ( &) 只是说运行这个,那个。