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

时间:2014-08-16 19:48:19

标签: windows batch-file command-line cmd simultaneous

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

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调用其他批处理文件,它们是否同时独立运行?主批处理文件不等待其他批处理文件中的结束程序?怎么做?

2 个答案:

答案 0 :(得分:23)

两个命令之间的

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

&&导致第二个命令的条件执行。仅当第一个命令成功时才执行第二个命令,这意味着退出并返回代码为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表示之前的命令以退出代码更大0 终止。由于命令dirmd永远不会以负值退出,因此只有0或更大(几乎所有命令和控制台应用程序)和值 0 是退出代码成功,这是测试成功执行dirmd的正确方法。请参阅Microsoft支持文章Testing for a Specific Error Level in Batch Files

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

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

示例:

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?上的答案,其中我解释了使用命令callstart运行批处理文件的差异,或者没有说明这两个命令来自批处理文件。

答案 1 :(得分:0)

还要考虑scriptrunner

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

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