首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Windows批处理文件的单行多命令

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

Stack Overflow用户
提问于 2014-08-17 03:48:19
回答 2查看 30.7K关注 0票数 18

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

代码语言:javascript
复制
dir & md folder1 & rename folder1 mainfolder

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

代码语言:javascript
复制
dir && md folder1 && rename folder1 mainfolder

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

我想问的另一件事:

单行batch.bat

代码语言:javascript
复制
dir & md folder1 & rename folder1 mainfolder

多线性batch.bat

代码语言:javascript
复制
dir
md folder1
rename folder1 mainfolder

2.就批处理文件过程而言,这是单行和多行吗?

还有一件事我想知道:

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-17 05:09:32

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

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

另一种解释请参见Conditional Execution

代码语言:javascript
复制
dir & md folder1 & rename folder1 mainfolder

因此是相等的

代码语言:javascript
复制
dir
md folder1
rename folder1 mainfolder

的多行替换

代码语言:javascript
复制
dir && md folder1 && rename folder1 mainfolder

将会是

代码语言:javascript
复制
dir
if not errorlevel 1 (
   md folder1
   if not errorlevel 1 (
      rename folder1 mainfolder
   )
)

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

关于errorlevel的其他有用的堆栈溢出主题

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

示例:

代码语言:javascript
复制
dir "C:\Users\%UserName%" /AD 2>nul || dir "%UserProfile%" /AD & echo User profile path: "%UserProfile%"

此命令行按如下方式执行:

代码语言:javascript
复制
dir "C:\Users\%UserName%" /AD 2>nul
if errorlevel 1 dir "%UserProfile%" /AD
echo User profile path: "%UserProfile%"

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

仅当独立于第二个目录<>E252的结果,第一个目录在第二个目录之后失败时,才有必要在执行ECHO时使用()

代码语言:javascript
复制
dir "C:\Users\%UserName%" /AD 2>nul || ( dir "%UserProfile%" /AD & echo User profile path: "%UserProfile%" )

此命令行按如下方式执行:

代码语言:javascript
复制
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或不使用这两个命令运行批处理文件的区别。

票数 30
EN

Stack Overflow用户

发布于 2021-01-06 16:40:31

还要考虑scriptrunner

代码语言:javascript
复制
ScriptRunner.exe -appvscript demoA.cmd arg1 arg2 -appvscriptrunnerparameters -wait -timeout=30 -rollbackonerror -appvscript demoB.ps1 arg3 arg4 -appvscriptrunnerparameters -wait -timeout=30 

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25343351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档