我尝试了解批处理文件中单个命令行中的多个命令如何工作。
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调用其他批处理文件,它们是否同时独立运行?主批处理文件不等待其他批处理文件中的结束程序?怎么做?
答案 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 终止。由于命令dir
和md
永远不会以负值退出,因此只有0或更大(几乎所有命令和控制台应用程序)和值 0 是退出代码成功,这是测试成功执行dir
和md
的正确方法。请参阅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?上的答案,其中我解释了使用命令call
或start
运行批处理文件的差异,或者没有说明这两个命令来自批处理文件。
答案 1 :(得分:0)
还要考虑scriptrunner
ScriptRunner.exe -appvscript demoA.cmd arg1 arg2 -appvscriptrunnerparameters -wait -timeout=30 -rollbackonerror -appvscript demoB.ps1 arg3 arg4 -appvscriptrunnerparameters -wait -timeout=30
还有回滚、超时和等待等功能。