start /wait /b 出错时不退出程序

Start /wait /b not exiting program when there is an error

我有一个批处理文件,它将 运行 几个其他文件(我们称之为过程文件),例如 .bat、.exe、.py 等...

if Not Exist JobStreamUnitTest_CreateTextPython_4-27-2015.txt (
    Start /wait /b C:\Users\blee2\Documents\UnitTest\CreateTextFile.py || exit %errorlevel%
    copy /y nul JobStreamUnitTest_CreateTextPython_4-27-2015.txt
)

if Not Exist JobStreamUnitTest_CreateTextBatch_4-27-2015.txt (
    Start /wait /b C:\Users\blee2\Documents\UnitTest\CreateNewFile.bat || exit %errorlevel%
    copy /y nul JobStreamUnitTest_CreateTextBatch_4-27-2015.txt
)

if Not Exist JobStreamUnitTest_CreateTextConsole_4-27-2015.txt (
    Start /wait /b C:\Users\blee2\Documents\UnitTest\TestConsole.exe apple || exit %errorlevel%
    copy /y nul JobStreamUnitTest_CreateTextConsole_4-27-2015.txt
)

if Not Exist JobStreamUnitTest_HelloWorld_4-27-2015.txt (
    Start /wait /b C:\Users\blee2\Documents\UnitTest\HelloWorld.bat || exit %errorlevel%
    copy /y nul JobStreamUnitTest_HelloWorld_4-27-2015.txt
)

所以基本上,批处理文件将根据与每个程序文件关联的虚拟文件的存在,检查是否需要以下文件 运行。 如果我们第二次运行批处理文件,这将阻止我们运行成功运行。

如果任何过程文件中都没有错误,那么代码将正常运行。

退出错误仅在 file/filepath 不正确时才会起作用。 我面临的问题是,因为 Start /wait /b 将始终执行,无论我的过程文件之一是否有错误。因此退出 %errorlevel% 不会是 运行。

如果过程文件损坏,如何让批处理文件检测到错误? 如果其中一个程序文件不起作用,我想 exit/terminal 批处理文件。有什么想法吗?

PS。 /wait 是必需的,因为开始应该按顺序 运行ning。
/b 是必需的,否则程序将在 运行ning a .bat 后停止; /b 允许我们在同一个 cmd window 中 运行 批处理文件。

感谢任何帮助,谢谢

已编辑: 如果我执行以下操作,代码将起作用。但我希望在我的批处理文件中有一个 consistency 格式,因为批处理文件是由 C# 通过解析 .xml 文件生成的。

if Not Exist JobStreamUnitTest_CreateTextPython_4-27-2015.txt (
    C:\Users\blee2\Documents\UnitTest\CreateTextFile.py || exit %errorlevel%
    copy /y nul JobStreamUnitTest_CreateTextPython_4-27-2015.txt
)

if Not Exist JobStreamUnitTest_CreateTextBatch_4-27-2015.txt (
    Start /wait /b C:\Users\blee2\Documents\UnitTest\CreateNewFile.bat || exit %errorlevel%
    copy /y nul JobStreamUnitTest_CreateTextBatch_4-27-2015.txt
)

我在 start /WAIT /B any_program || exit %errorlevel% 中发现了一些问题:

  • #1 - %errorlevel% 变量将在解析时展开。因此你的脚本永远不会 returns 正确的退出代码。 See EnableDelayedExpansion.
  • #2 - || 条件命令执行:不幸的是我无法正确记录它,但我对它的所有尝试都失败了 start 命令...

恕我直言,下一个代码片段(唯一的示例)可以按预期工作:

if Not Exist JobStreamUnitTest_CreateTextBatch_4-27-2015.txt (
    start /B /WAIT C:\Users\blee2\Documents\UnitTest\CreateNewFile.bat
    SETLOCAL enabledelayedexpansion
    if !errorlevel! NEQ 0 exit !errorlevel!
    ENDLOCAL
    copy /y nul JobStreamUnitTest_CreateTextBatch_4-27-2015.txt
)
  • #3 - start 命令 执行中的错误。

start /WAIT /B 不起作用(忽略 /wait 参数):

==>start /WAIT /B wmic OS GET Caption & echo xxx
xxx

==>Caption
Microsoft Windows 8.1

There's a simple workaround (from SupeUser) 因为 start /B /WAIT 有效:

==>start /B /WAIT wmic OS GET Caption & echo xxx
Caption
Microsoft Windows 8.1

xxx