批处理文件中命令的执行顺序

批处理文件中命令的执行顺序

我如何才能创建一个批处理文件,仅在成功执行上一个命令后才执行该命令?

答案1

取决于你所说的成功是什么意思。如果你想检查是否foo.exe没有返回任何退出代码除了 0 之外,使用:

@echo off
start /wait foo.exe
if errorlevel 0 (
  start /wait bar.exe
)

返回退出代码bar.exe后运行。如果您测试的应用程序是控制台应用程序而不是桌面应用程序,则可以省略。foo.exe0start /wait

更多相关信息:如何从 Windows 命令行获取应用程序退出代码?,在回答中塞缪尔·伦克特加里

答案2

除了 Hex 发布的、并通过 Michael 的评论得到改进的错误级别解决方案之外。

对于您想要做的事情来说,这个甚至可以更快地完成。

第一个命令 && 第二个命令

仅当第一个命令成功时,第二个命令才会运行。即,如果第一个命令没有返回错误。

在下面的例子中,dir asfsds 返回该输出,但也返回错误

如果您执行 dir asdfsss & blah,那么无论第一个命令(dir sdsdf)是否返回错误,它都会运行 blah。

但是如果你在它们之间使用 && 来运行它们,那么如果第一个是错误,它就不会运行第二个。它基于布尔代数的思想,如果 A 为真并且 B 为真,那么 A AND B 也为真。因此,要确定 A 和 B 是否为真,你可以检查 A 和 B,或者你可以“偷懒”或更高效,只检查一个,如果它为假,你就知道整个表达式为假。如果它为真,那么你必须检查另一个。因此 A && B 检查 A,并且只有在必须检查 B 时才检查 B,因此只有在 B 为真时才检查 B。但是布尔代数概念应用于命令,因此它会运行第一个,第一个可能会返回错误,也可能不会,如果第一个确实返回错误,那么它不会尝试运行和签入第二个,如果第一个不返回错误,那么它将尝试第二个。毫无疑问,如果两者都为真,表达式本身将返回 true(无错误),否则返回 false(错误)。

C:\Users\user>dir asdfsdf
驱动器 C 中的卷没有标签。卷序列号为 B411-D580

C:\Users\user 目录

文件未找到<---------------- 参见上面的 dir asdfdsds 的输出

C:\Users\user>dir asdfsdf & echo a
驱动器 C 中的卷没有标签。卷序列号为 B411-D580

C:\Users\user 目录

文件未找到 a <--- 看到 'echo a' 运行

C:\Users\user>dir asdfsdf && echo a
驱动器 C 中的卷没有标签。卷序列号为 B411-D580

C:\Users\user 目录

文件未找到

C:\用户\用户>

如果您执行了 dir filethatexists && echo a,那么您将看到第一个命令成功运行,然后 echo a 运行。同样,echo a && echo b

相关内容