【问题标题】:How do I run two commands in one line in Windows CMD?如何在 Windows CMD 中在一行中运行两个命令?
【发布时间】:2011-12-24 17:13:20
【问题描述】:

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

在 Linux 中我会这样做

touch thisfile ; ls -lstrh

如何在 Windows 上完成?

【问题讨论】:

    标签: windows batch-file command-line cmd


    【解决方案1】:

    自 2000 年以来在所有 Microsoft 操作系统上都采用这种方式,并且今天仍然很好:

    dir & echo foo
    

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

    dir && echo foo
    

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

    向下滚动此页面,您会发现很多其他要点。

    以下是历史数据,供那些可能觉得具有教育意义的人参考。

    在此之前,&& 语法只是 shell 替换 4DOS 的一个特性,然后该特性才被添加到 Microsoft 命令解释器中。

    在 Windows 95、98 和 ME 中,您可以改用竖线字符:

    dir | echo foo
    

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

    dir ^T echo foo
    

    【讨论】:

    • 也适用于 Win 8.0 和 8.1。
    • @Fallenreaper,这在直接的cmd 提示符下也有效,所以我想养成这个习惯并不是一个坏习惯。 :)
    • @Fallenreaper 确保您了解两者之间的实际区别:请参阅下面 Raihan 的回答。
    • 知道了。 A && B, B 只有在 A 成功时才会运行,而 A & B 将在 A 之后运行 B,无论 A 的结果如何。感谢您的提醒
    • @infografnet 这是一个不同的问题。两个命令都运行,但在实际执行任一命令之前评估环境变量替换。所以echo %myvar% 将作为echo OldValueOfMyVar 运行。这个问题可以通过使用延迟扩展功能来解决(虽然仅在批处理文件中可用)。因此,请在批处理文件中尝试以下操作:setlocal EnableDelayedExpansion && set MyVar=MyVal && echo !MyVar! && endlocal。 (注意:该功能要求您使用! 标记代替% 符号。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      引用自文档:

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

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

      例如,您可能希望仅在前一个命令失败时才运行命令。或者,您可能希望仅在前一个命令成功时才运行命令。

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

      • & [...]
        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 上没有引号。
      • 谢谢!我不知道单 & - 使其异步并并行运行。我被卡住了,因为我使用 && 是同步的,只有在第一次成功时才会继续!
      • @TetraDev & 不会使命令异步或并行。 command1 & command2 将在 command2 command1 完成后运行。 command1的成败无关紧要。
      【解决方案4】:

      &;(运行命令)的 Bash 等效项,&&&& 的 Bash 等效项(仅在前一个未导致错误时运行命令)。

      【讨论】:

      • 这也适用于 csh、tcsh 和更多的 shell。我以前从未在 Linux 中见过 ;
      • @LưuVĩnhPhúc 在 sh 样式的 shell 中,; 表示运行第一个命令,等待它完成,然后运行第二个命令。 & 表示运行第一个命令,将其置于后台,然后运行第二个命令。所以两个程序同时启动。请注意,这些不是组合符号,它们是第一个命令的尾随符号;您可以在后台使用progname & 启动单个命令,而无需第二个命令。
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        cmd /c ipconfig /all & Output.txt

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

        【讨论】:

          【解决方案7】:

          所以,我试图从上下文菜单启用运行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"
          

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

          【讨论】:

          【解决方案8】:

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

          set A=Hello & call echo %A%
          

          【讨论】:

          • 这仅适用于尚未设置变量的情况,在这种情况下,echo 会打印出 old 值,而不是新值。至少,这是我在 Windows 7 机器上观察到的。
          • 我首先使用 set A= 来确保变量没有被设置。
          • 更好的方法是使用延迟扩展(脚本中的setlocal EnableDelayedExpansioncmd /v)。例如:timeout 5 && cmd /v /c echo !TIME! && echo %TIME%.
          • 在第一个百分比之后使用 ^ 来获取新值:set A=Hello & call echo %^A%
          • 感谢 Nick 和 Nicolas 提供的解决方案!我尝试在更一般的情况下使用它们,当 set 之后有多个用 & 分隔的命令时,我发现它只适用于其他语法技巧。使用尼克的解决方案,我应该将命令分隔符转义为 ^&:set var=Hello & cmd /v /c echo firstUsage=!var! ^& echo secondUsage=!var!。使用 Nicolas 的解决方案,我应该在每个子命令之前重复 callset var=Hello & call echo firstUsage=%^var% & call echo secondUsage=%^var%(可能知道如何改进)。
          【解决方案9】:

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

          管道有一些问题,但只要人们知道它是如何工作的,这并不重要。

          【讨论】:

            【解决方案10】:

            在同一行上运行多个命令时可以使用多个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 /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
            【解决方案11】:

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

            color 0a & start chrome.exe
            

            干杯!

            【讨论】:

              【解决方案12】:

              我尝试在同一个窗口中有两个 ping,它是同一行上的串行命令。完成第一个命令后,运行第二个命令。

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

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

              用于在同一行启动的命令是:

              start /b command1 parameters & command2 parameters
              

              无论如何,如果你想解析输出,我不推荐使用这个。 我注意到输出在命令的输出之间被打乱了。

              【讨论】:

                【解决方案13】:

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

                DIR /S & START FILE.TXT
                

                或者,

                tasklist | find "notepad.exe"
                

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

                【讨论】:

                • 您能否编辑您的帖子以包含一些解释 &| 的作用以及它们有何不同(如果有的话)?现在,不熟悉这些概念的人无法自行决定在他们的案例中应该使用哪一个。
                • 和我一样。我的错。我会立即编辑帖子。欣赏它。
                • 应该是“findstr”而不是“find”
                【解决方案14】:

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

                gulp - 默认 > 构建

                gulp build - 构建构建文件夹

                gulp watch - 开始文件监视

                gulp dist - 构建 dist 文件夹

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

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

                【讨论】:

                  【解决方案15】:

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

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

                  “再见世界”将在“Hello World”之后打印。

                  【讨论】:

                  • 独立于事实,已经有旧答案显示相同,它仍然不完全正确。 && 是一个条件操作符,只有当第一个命令成功时才会执行下一个命令(errorlevel=0)
                  • 当然。不言而喻,如果该人想要运行两个命令,这两个命令将是正确的,因此一切都会顺利
                  • Rajan:他的意思是“只有在第一个命令成功的情况下才会执行下一个命令”。
                  • Goodbye World 将在 Hello World 之后打印”,前提是打印 Hello World 没有失败。正如@jeb 所说,&& 是有条件的。 & 运行命令,无论前面是否成功。
                  【解决方案16】:

                  当您尝试在一行中使用或操作变量时,请注意它们的内容!例如。像下面这样的变量

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

                  如果你把它当成%PATH%使用可能会导致很多无法解决的麻烦

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

                  【讨论】:

                  • 这与在 Windows CMD 中在一行中运行两个命令有什么关系?
                  【解决方案17】:

                  是的,有。我是&

                  && 将在命令 1 完成时执行命令 2,前提是它没有失败。

                  & 无论如何都会执行。

                  【讨论】:

                    【解决方案18】:

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

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

                    就像在linux中一样 我们使用,

                    touch thisfile ; ls -lstrh
                    

                    【讨论】:

                      【解决方案19】:

                      在 Windows 10 中,您还可以使用scriptrunner

                      ScriptRunner.exe -appvscript demoA.cmd arg1 arg2 -appvscriptrunnerparameters -wait -timeout=30 -rollbackonerror -appvscript demoB.ps1 arg3 arg4 -appvscriptrunnerparameters -wait -timeout=30 -rollbackonerror
                      

                      它允许您在一行上启动几个命令,您可以连续运行它们或不相互等待,您可以设置超时和回滚错误。

                      【讨论】:

                        【解决方案20】:

                        尝试使用 doskey 键和 $T 创建一个 .bat ot .cmd 文件,这相当于 & 在一行中执行多个命令行:

                        touch=echo off $T echo. ^> $* $T dir /B $T echo on
                        

                        它会创建一个空文件。

                        例子:

                        touch myfile
                        

                        在 cmd 中你会得到这样的东西:

                        但是正如其他人之前提到的那样,确实建议使用& 运算符在CMD 提示符下在一行中执行多个命令行。

                        享受 =)

                        【讨论】:

                          【解决方案21】:

                          在命令之间使用&&
                          例如:cls && echo 'hello' && dir c:

                          【讨论】:

                          • 有一个 9 年前的答案,描述相同,但有解释。顺便提一句。 &&并不总是执行下一条命令,只有在第一条命令执行成功时才会执行
                          猜你喜欢
                          • 2023-04-06
                          • 2018-03-15
                          • 2012-04-10
                          • 1970-01-01
                          • 2014-12-28
                          • 1970-01-01
                          • 1970-01-01
                          • 2023-03-17
                          • 2012-12-07
                          相关资源
                          最近更新 更多