我如何才能创建一个批处理文件,仅在成功执行上一个命令后才执行该命令?
答案1
取决于你所说的成功是什么意思。如果你想检查是否foo.exe
没有返回任何退出代码除了 0 之外,使用:
@echo off
start /wait foo.exe
if errorlevel 0 (
start /wait bar.exe
)
返回退出代码bar.exe
后运行。如果您测试的应用程序是控制台应用程序而不是桌面应用程序,则可以省略。foo.exe
0
start /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-D580C:\Users\user 目录
文件未找到<---------------- 参见上面的 dir asdfdsds 的输出
C:\Users\user>dir asdfsdf & echo a
驱动器 C 中的卷没有标签。卷序列号为 B411-D580C:\Users\user 目录
文件未找到 a <--- 看到 'echo a' 运行
C:\Users\user>dir asdfsdf && echo a
驱动器 C 中的卷没有标签。卷序列号为 B411-D580C:\Users\user 目录
文件未找到
C:\用户\用户>
如果您执行了 dir filethatexists && echo a,那么您将看到第一个命令成功运行,然后 echo a 运行。同样,echo a && echo b