ChatGPT解决这个技术问题 Extra ChatGPT

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

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

在Linux中我会这样做

touch thisfile ; ls -lstrh

它是如何在 Windows 上完成的?


d
djdanlib

自 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。 (注意:该功能要求您使用 ! 标记代替 % 符号。
J
Jean-François Corbett

文档中的引用:

来源: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 上不带引号。
文档链接已损坏,新位置 technet.microsoft.com/en-us/library/bb490954.aspx
@TetraDev & 不会使命令异步或并行。 command1 & command2 将在 command2 command1 完成后运行。 command1 的成功或失败无关紧要。
此外,将 & 与 if 语句混合起来可能有点棘手。要在没有 else 语句的 if 语句之后运行命令,请使用 (if condition command1) & command2。不要尝试使用 if condition (command1) & command2,因为 command2 不会运行。
P
Peter Mortensen

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


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

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


T
TroodoN-Mike

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

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

S
Stephan

您可以使用 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%
感谢尼克和尼古拉斯为您提供解决方案!我尝试在更一般的情况下使用它们,当 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%(可能知道如何改进它)。
G
Graham

在同一行上运行多个命令时可以使用多个 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!%"
J
Jeremy Collette

cmd /c ipconfig /all & Output.txt

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


C
Community

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

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


P
Peter Mortensen

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

DIR /S & START FILE.TXT

或者,

tasklist | find "notepad.exe"

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


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

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

color 0a & start chrome.exe

干杯!


P
Peter Mortensen

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

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

像往常一样启动,不带 /b,然后在单独的窗口中启动。

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

start /b command1 parameters & command2 parameters

无论如何,如果您想解析输出,我不建议使用它。我注意到输出在命令的输出之间被打乱了。


A
Arshdeep Kharbanda

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

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

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

touch thisfile ; ls -lstrh

P
Peter Mortensen

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

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


P
Peter Mortensen

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

gulp - 默认 >建造

gulp build - 构建构建文件夹

gulp watch - 启动文件监视

gulp dist - 构建 dist 文件夹

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

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

n
npocmaka

对于 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

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


V
Vikas Chauhan

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

npm install; npm start

ه
هادی کشاورز Hadi Keshavarz

就在这里。这是&

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

& 无论如何都会执行。


B
Bk01

尝试使用 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 提示符下在一行中执行多个命令行。

享受 =)


V
V15I0N

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

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

如果您将其用作%PATH%,可能会导致很多无法解决的问题

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


这与在 Windows CMD 中在一行中运行两个命令有什么关系?
R
Rajan Dhanowa

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

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

在“Hello World”之后会打印“Goodbye World”。


与事实无关,已经有旧答案显示相同,它仍然不是很正确。 &&条件 运算符,仅在第一个命令成功时执行下一个命令(errorlevel=0)
当然。不言而喻,如果该人想要运行两个命令,这两个命令将是正确的,因此一切都会好起来的
Rajan:他的意思是“只有在第一个命令成功的情况下才会执行下一个命令”。
Goodbye World 将在 Hello World 之后打印”,前提是打印 Hello World 没有失败。正如@jeb 所说,&& 是有条件的。 & 运行命令,无论前面是否成功。
D
Destroyica

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


有一个 9 岁的答案,描述相同,但有解释。顺便提一句。 && 并不总是执行下一个命令,只有当第一个命令执行成功时