出现错误时,启动/等待/ b不退出程序

Ben*_*Lee 3 windows command-line cmd batch-file

我有一个批处理文件,它将运行几个其他文件(让我们称之为程序文件),如.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
)
Run Code Online (Sandbox Code Playgroud)

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

如果任何过程文件中没有错误,那么代码将正常工作.

退出错误仅在文件/文件路径不正确时才有效.我面临的问题是,因为无论我的某个过程文件是否有错误,Start/wait/b将始终执行.因此,不会运行退出%errorlevel%.

如果过程文件损坏,如何允许批处理文件检测错误?如果其中一个过程文件不起作用,我想退出/终止批处理文件.有什么想法吗?

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

感谢任何帮助,谢谢

编辑:如果我执行以下操作,代码将起作用.但我希望在我的批处理文件中有一致性格式,因为批处理文件是由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
)
Run Code Online (Sandbox Code Playgroud)

Jos*_*efZ 5

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

  • #1 - %errorlevel%变量将在分析时扩展.因此,您的脚本从不返回正确的退出代码 请参见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
)
Run Code Online (Sandbox Code Playgroud)
  • #3 - 执行start命令的错误.

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

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

==>Caption
Microsoft Windows 8.1
Run Code Online (Sandbox Code Playgroud)

有一个简单的解决方法(来自SupeUser)作为start /B /WAIT工程:

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

xxx
Run Code Online (Sandbox Code Playgroud)