我想在 Windows CMD 控制台中运行两个命令。
在Linux中我会这样做
touch thisfile ; ls -lstrh
它是如何在 Windows 上完成的?
自 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
文档中的引用:
来源:Microsoft、Windows XP Professional 产品文档、命令外壳概述
另外:Windows CMD 命令的 AZ 索引
使用多个命令和条件处理符号 您可以使用条件处理符号从单个命令行或脚本运行多个命令。当您使用条件处理符号运行多个命令时,条件处理符号右侧的命令将根据条件处理符号左侧命令的结果进行操作。例如,您可能希望仅在前一个命令失败时才运行命令。或者,您可能只想在前一个命令成功时才运行命令。您可以使用下表中列出的特殊字符来传递多个命令。 & [...] command1 & command2 用于在一个命令行上分隔多个命令。 Cmd.exe 运行第一个命令,然后运行第二个命令。 && [...] command1 && command2 仅当符号前面的命令成功时才用于运行 && 后面的命令。 Cmd.exe 运行第一个命令,然后仅当第一个命令成功完成时才运行第二个命令。 || [...] 命令1 || command2 用于运行 || 后面的命令仅当 || 前面的命令失败。 Cmd.exe 运行第一个命令,然后仅当第一个命令未成功完成时才运行第二个命令(收到大于零的错误代码)。 ( ) [...] (command1 & command2) 用于对多个命令进行分组或嵌套。 ;或 , command1 parameter1;parameter2 用于分隔命令参数。
cmd /c "echo foo & echo bar"
。
vagrant up && vagrant ssh
在 Windows 10 上不带引号。
&
不会使命令异步或并行。 command1 & command2
将在 command2
command1
完成后运行。 command1
的成功或失败无关紧要。
&
与 if 语句混合起来可能有点棘手。要在没有 else 语句的 if 语句之后运行命令,请使用 (if condition command1) & command2
。不要尝试使用 if condition (command1) & command2
,因为 command2 不会运行。
&
是 ;
(运行命令)的 Bash 等效项,而 &&
是 &&
的 Bash 等效项(仅在前一个未导致错误时运行命令)。
;
;
表示运行第一个命令,等待它完成,然后运行第二个命令。 &
表示运行第一个命令,将其置于后台,然后运行第二个命令。所以两个程序同时启动。请注意,这些不是组合符号,它们是第一个命令的尾随符号;您可以使用 progname &
在后台启动单个命令,而无需第二个命令。
您可以使用 &一个接一个地运行命令。示例:c:\dir & vim myFile.txt
如果要创建 cmd 快捷方式(例如在桌面上)添加 /k 参数(/k 表示保留,/c 将关闭窗口):
cmd /k echo hello && cd c:\ && cd Windows
您可以使用 call 来克服过早评估环境变量的问题 - 例如
set A=Hello & call echo %A%
echo
会打印出 old 值,而不是新值。至少,这是我在 Windows 7 机器上观察到的。
setlocal EnableDelayedExpansion
或 cmd /v
)。例如:timeout 5 && cmd /v /c echo !TIME! && echo %TIME%
。
set var=Hello & cmd /v /c echo firstUsage=!var! ^& echo secondUsage=!var!
。使用 Nicolas 的解决方案,我应该在每个子命令之前重复 call:set var=Hello & call echo firstUsage=%^var% & call echo secondUsage=%^var%
(可能知道如何改进它)。
在同一行上运行多个命令时可以使用多个 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!%"
cmd /c ipconfig /all & Output.txt
此命令执行命令并在单个命令中打开 Output.txt
文件
因此,我试图从上下文菜单启用运行 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 在文件上运行并显示其结果,然后显示“按任意键继续...”提示,然后在按下某个键时关闭命令提示符窗口。
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"
现在我有一个不错的右键菜单来注册程序集。
好吧,您有两个选择:管道,或者只是 &
:
DIR /S & START FILE.TXT
或者,
tasklist | find "notepad.exe"
管道 (|
) 更多地用于获取一个命令的输出并将其放入另一个命令。并且 (&
) 只是说运行这个,那个。
&
和 |
的作用以及它们有何不同(如果有的话)?现在,不熟悉这些概念的人无法自行决定在他们的案例中应该使用哪一个。
为了同时执行两个命令,您必须在两个命令之间放置一个 &(和号)符号。像这样:
color 0a & start chrome.exe
干杯!
我尝试在同一个窗口中有两个 ping,它是同一行上的串行命令。完成第一个命令后,运行第二个命令。
解决方案是在 Windows 7 命令提示符下与 start /b
结合使用。
像往常一样启动,不带 /b
,然后在单独的窗口中启动。
用于在同一行中启动的命令是:
start /b command1 parameters & command2 parameters
无论如何,如果您想解析输出,我不建议使用它。我注意到输出在命令的输出之间被打乱了。
在 Windows 中使用 &
符号以在一行中使用命令
C:\Users\Arshdeep Singh>cd Desktop\PROJECTS\PYTHON\programiz & jupyter notebook
就像在我们使用的linux中一样,
touch thisfile ; ls -lstrh
不,cd / && tree && echo %time%
。回显的时间是执行第一个命令的时间。
管道有一些问题,但只要人们知道它是如何工作的,这并不重要。
再举一个例子:例如,当我们使用 gulp
构建系统时,而不是
gulp
- 默认 >建造
gulp build
- 构建构建文件夹
gulp watch
- 启动文件监视
gulp dist
- 构建 dist 文件夹
我们可以用一行来做到这一点:
cd c:\xampp\htdocs\project & gulp & gulp watch
对于 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
它允许您在一行上启动几个命令,您可以连续运行它们或无需相互等待,您可以设置超时和回滚错误。
在 Windows 中,我使用了上述所有解决方案 &, &&
但没有任何效果最后 ';'
符号对我有用
npm install; npm start
就在这里。这是&
。
&&
将在命令 1 完成时执行命令 2,前提是它没有失败。
&
无论如何都会执行。
尝试使用 doskey
键和 $T
创建一个 .bat ot .cmd 文件,这相当于 &
在一行中执行多个命令行:
touch=echo off $T echo. ^> $* $T dir /B $T echo on
它将创建一个空文件。
例子:
touch myfile
在 cmd 你会得到这样的东西:
https://i.stack.imgur.com/mM2dS.png
但是正如其他人之前提到的,确实建议使用 &
运算符在 CMD 提示符下在一行中执行多个命令行。
享受 =)
当您尝试在一行中使用或操作变量时,请注意它们的内容!例如像下面这样的变量
PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
如果您将其用作%PATH%
,可能会导致很多无法解决的问题
右括号终止您的组语句 双引号不允许您使用 %PATH% 来处理括号问题 像 %USERPROFILE% 这样的引用变量将包含什么?
很简单:只需用 &&
符号区分它们即可。例子:
echo "Hello World" && echo "GoodBye World".
在“Hello World”之后会打印“Goodbye World”。
&&
是 条件 运算符,仅在第一个命令成功时执行下一个命令(errorlevel=0)
Hello World
没有失败。正如@jeb 所说,&&
是有条件的。 &
运行命令,无论前面是否成功。
在命令之间使用 &&
。
例如:cls && echo 'hello' && dir c:
&&
并不总是执行下一个命令,只有当第一个命令执行成功时
cmd
提示符下也有效,所以我认为这不是一个坏习惯。 :)echo %myvar%
将作为echo OldValueOfMyVar
运行。这个问题可以通过使用延迟扩展功能来解决(虽然仅在批处理文件中可用)。因此,请在批处理文件中尝试以下操作:setlocal EnableDelayedExpansion && set MyVar=MyVal && echo !MyVar! && endlocal
。 (注意:该功能要求您使用!
标记代替%
符号。