关于批处理文件:如何在windows cmd的一行中运行两个命令?

How do I run two commands in one line in Windows CMD?

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

在Linux中,我会这样做

1
touch thisfile ; ls -lstrh

如何在Windows上完成?


自2000年以来,所有微软操作系统都是这样,今天仍然不错:

1
dir & echo foo

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

1
dir && echo foo

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

关于这一点,你会发现有很多其他的点可以向下滚动这个页面。

历史数据如下,对于那些可能认为它具有教育意义的人。

在此之前,在该功能添加到Microsoft命令解释器之前,&;语法只是shell替换4dos的一个功能。

在Windows95、98和Me中,您将使用管道字符:

1
dir | echo foo

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

1
dir ^T echo foo


文档中的引用:

  • 来源:Microsoft、Windows XP专业版产品文档、命令shell概述

Using multiple commands and conditional processing symbols

You can run multiple commands from a single command line or script using conditional processing symbols. When you run multiple commands with conditional processing symbols, the commands to the right of the conditional processing symbol act based upon the results of the command to the left of the conditional processing symbol.

For example, you might want to run a command only if the previous command fails. Or, you might want to run a command only if the previous command is successful.

You can use the special characters listed in the following table to pass multiple commands.

  • & [...]
    command1 & command2
    Use to separate multiple commands on one command line. Cmd.exe runs the first command, and then the second command.

  • && [...]
    command1 && command2
    Use to run the command following && only if the command preceding the symbol is successful. Cmd.exe runs the first command, and then runs the second command only if the first command completed successfully.

  • || [...]
    command1 || command2
    Use to run the command following || only if the command preceding || fails. Cmd.exe runs the first command, and then runs the second command only if the first command did not complete successfully (receives an error code greater than zero).

  • ( ) [...]
    (command1 & command2)
    Use to group or nest multiple commands.

  • ; or ,
    command1 parameter1;parameter2
    Use to separate command parameters.


&;的bash等价物(run commands),&&&&的bash等价物(仅当前面的命令没有引起错误时才运行命令)。


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


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

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

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

1
set A=Hello & call echo %A%


因此,我试图从上下文菜单中启用运行EDOCX1(register assembly)的特定任务。我遇到的问题是,在我读到结果之前,结果会闪现并消失。所以我尝试通过管道连接到Pause,当命令失败时,它不工作(如这里所述,pause命令不在.bat脚本中工作,而这里批处理文件命令pause不工作)。所以我尝试了cmd /k,但这让窗口可以打开更多命令(我只是想读取结果)。因此,我在链中添加了一个Pause,后跟exit,结果如下:

cmd /k C:\Windows\Microsoft.NET\Framework\v4.0.30319
egasm.exe"%1" /codebase \"%1\" & pause & exit

这就像一个符咒——regasm在文件上运行并显示其结果,然后显示"按任意键继续…"提示,然后按某个键时命令提示窗口关闭。

p.s.对于可能感兴趣的其他人,可以使用以下.reg文件条目向.dll文件添加dll file关联,然后使用regasm命令扩展名(注意转义引号和反斜杠):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[HKEY_CLASSES_ROOT\.dll]
"Content Type"="application/x-msdownload"
@="dllfile"

[HKEY_CLASSES_ROOT\dllfile]
@="Application Extension"

[HKEY_CLASSES_ROOT\dllfile\Shell
egAsm]
@="Register Assembly"

[HKEY_CLASSES_ROOT\dllfile\Shell
egAsm\command]
@="cmd /k C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\
egasm.exe "%1" /codebase "%1" & pause & exit"

现在我有了一个很好的右击菜单来注册一个程序集。


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

1
2
3
4
5
6
@echo off
setlocal enabledelayedexpansion
set count=0
set"count=1" & echo %count% !count!

0 1

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

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

path5=C:\Users\UserName\AppData\Local\Temp\MyFile5


cmd /c ipconfig /all & Output.txt

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


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

1
color 0a & start chrome.exe

干杯!


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

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

像往常一样启动,不使用/b,并在单独的窗口中启动。

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

1
start /b command1 parameters & command2 parameters

无论如何,如果您希望解析输出,我不建议使用这个。我注意到输出在命令输出之间被置乱。


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

1
DIR /S & START FILE.TXT

或者,

1
tasklist | find"notepad.exe"

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


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

管道有一些问题,但只要人们知道它是如何工作的,它就不是关键。


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

gulp-默认>构建

gulp build—构建构建文件夹

gulp watch启动文件监视

gulp dist—构建dist文件夹

我们可以用一条线来完成:

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

这很简单:只需用符号来区分它们。例子:

1
echo Hello World && echo GoodBye World

再见世界将在你好世界之后印刷。


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

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

如果你把它当作%PATH%使用,可能会导致很多无法处理的麻烦。

  • 右括号结束您的group语句
  • 双引号不允许使用%PATH%来处理括号问题。
  • %USERPROFILE%这样的引用变量将包含什么?

  • 是的。它是。

    &如果命令1没有失败,它将在命令1完成时执行命令2。

    &将执行而不管。