windows - Start/wait/b 出错时不退出程序

标签 windows batch-file command-line cmd

我有一个批处理文件,它将运行几个其他文件(我们称之为过程文件),例如 .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
)

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

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

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

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

附言。/wait 是必需的,因为启动应该按顺序运行。
/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
)

最佳答案

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

  • #1 - %errorlevel% 变量将在解析时展开。因此您的脚本永远不会返回正确的退出代码。 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

关于windows - Start/wait/b 出错时不退出程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29925764/

相关文章:

c# - 在打开加密文件系统的情况下从 C# 创建一个新目录

batch-file - 如何使用批处理文件解压缩 ZIP 存档文件?

batch-file - 在 PSFTP 中使用 'for' 命令查找并下载 SFTP 服务器上的最新文件

从命令行快速主运行/构建

json - 从命令行将 Swagger YAML 文件转换为 JSON

c# - 在桌面应用程序中检测 Windows 7 和 8 中的 3G 连接

android - 目录在 Windows 上显示为文件

batch-file - 如果调用的命令执行 `exit`,如何避免退出 Windows cmd 终端?

windows - 如何使用 xcopy 将文件复制到不存在的目录中?