使用 Windows 批处理文件的具有多个命令的单行

Posted

技术标签:

【中文标题】使用 Windows 批处理文件的具有多个命令的单行【英文标题】:Single line with multiple commands using Windows batch file 【发布时间】:2014-10-10 04:31:38 【问题描述】:

我试图了解批处理文件中单个命令行中的多个命令是如何工作的。

dir & md folder1 & rename folder1 mainfolder

和其他类似命令的情况,但& 替换为&&

dir && md folder1 && rename folder1 mainfolder

1.这两种情况有什么区别?


我想问的其他问题:

单线batch.bat:

dir & md folder1 & rename folder1 mainfolder

多线batch.bat:

dir
md folder1
rename folder1 mainfolder

2.就批处理文件程序而言,这种单行和多行是否相等?


还有一件事我想知道:

3.如果我从 main.bat 调用其他批处理文件,它们是否独立运行并同时运行?主批处理文件不等待其他批处理文件中的程序结束?该怎么做?

【问题讨论】:

【参考方案1】:

& 在两个命令之间只会导致两个命令的执行独立于第一个命令的结果。 & 的右侧命令在& 左侧的命令完成后执行,独立于前一个命令的成功或错误,即独立于前一个命令的退出/返回值。

&& 导致有条件地执行第二个命令。仅当第一个命令成功时才执行第二个命令,这意味着以返回码 0 退出。

其他解释见Conditional Execution。

dir & md folder1 & rename folder1 mainfolder

因此相等

dir
md folder1
rename folder1 mainfolder

多行替换

dir && md folder1 && rename folder1 mainfolder

dir
if not errorlevel 1 (
   md folder1
   if not errorlevel 1 (
      rename folder1 mainfolder
   )
)

if not errorlevel 1 表示之前的命令 not 以退出代码 greater 0 终止。由于命令 dirmd 永远不会以负值退出,只有 0 或更大(几乎所有命令和控制台应用程序)并且值 0 是成功的退出代码,这是测试dirmd 成功执行的正确方法。

关于 errorlevel 的其他有用的 Stack Overflow 主题:

Which cmd.exe internal commands clear the ERRORLEVEL to 0 upon success? What are the ERRORLEVEL values set by internal cmd.exe commands?

必须注意将无条件运算符&&&|| 等条件运算符混合使用,因为执行顺序不一定是命令行上命令的顺序。

例子:

dir "C:\Users\%UserName%" /AD 2>nul || dir "%UserProfile%" /AD & echo User profile path: "%UserProfile%"

这个命令行被执行为:

dir "C:\Users\%UserName%" /AD 2>nul
if errorlevel 1 dir "%UserProfile%" /AD
echo User profile path: "%UserProfile%"

ECHO 命令始终独立于第一个 DIR 的执行结果执行,而第二个 DIR 仅在第一个 DIR 时执行 在 Windows XP 上失败,或者用户的配置文件文件夹不在驱动器 C: 上,或者根本不在文件夹 Users 中。

只有当第一个 DIR 在第二个 DIR 之后失败时,才需要在执行 ECHO 时使用 () 与结果无关第二个DIR

dir "C:\Users\%UserName%" /AD 2>nul || ( dir "%UserProfile%" /AD & echo User profile path: "%UserProfile%" )

这个命令行被执行为:

dir "C:\Users\%UserName%" /AD 2>nul
if errorlevel 1 (
    dir "%UserProfile%" /AD
    echo User profile path: "%UserProfile%"
)

对于第三个问题的答案,请参阅我在 How to call a batch file in the parent folder of current batch file? 上的答案,其中我解释了使用命令 call 或使用命令 start 或在批处理文件中不使用这两个命令运行批处理文件的区别.

【讨论】:

【参考方案2】:

也可以考虑scriptrunner

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

它还具有回滚、超时和等待等功能。

【讨论】:

以上是关于使用 Windows 批处理文件的具有多个命令的单行的主要内容,如果未能解决你的问题,请参考以下文章

WINDOWS 批处理命COPY 合并多个文件的问题

如何使用一个命令一次启动多个Windows服务?

Windows 批处理:在 FOR 循环中调用多个命令?

如何使用带有路径的“开始”和带有空格的命令在 Windows 中创建批处理文件

Windows 窗体引用和具有冲突导入类型的单例

Xamarin MVVMCross:注册具有多个接口的类的单例