【问题标题】:ExitCode from Batchfile is weird批处理文件的退出代码很奇怪
【发布时间】:2018-05-24 09:42:30
【问题描述】:

我正在尝试从 powershell 脚本运行批处理文件并检查运行时是否出现任何错误。

现在,我正在通过以下代码进行操作:

$job = Start-Process -FilePath "C:\Test\Testfile_2.bat" -Wait -passthru;
$job.ExitCode

这行得通……或者至少差不多。

虽然我得到了 exitCode,但它实际上只提供了有关批处理文件运行的最后一个命令的信息。让我解释一下。

如果我在批处理文件中执行以下操作:

MKDIR C:\Test\Testdir

如果我运行它,我会在第一次运行它时得到 exitCode “0”,对于接下来的所有运行,我都会得到“1”,因为该目录已经存在。但如果我在批处理文件的末尾添加一张简单的 CD:

MKDIR C:\Test\Testdir
CD C:\

我会总是得到 exitCode “0”,因为 CD 命令每次都有效。所以即使目录存在并且它会给我一个cmd中的错误,exitCode中没有错误。有没有办法在使用 powershell 的批处理文件运行期间检查是否有任何错误,或者我是否必须以一旦出现错误就取消并立即返回错误 exitCode 的方式对批处理文件进行编码?

感谢您的帮助或建议!

【问题讨论】:

  • 为什么不在 PowerShell 中编写整个内容?这样,您将获得更好的错误通知等。
  • 只是因为您要求提供批处理文件退出的最后一个退出代码。
  • 这里的批处理文件只是一个例子。我尝试运行的批处理文件是一个包含大约 3000 行代码的自动化脚本,powershell 无法轻易替换它。
  • @GerhardBarnard 是的,我知道我要求这个,我知道为什么我得到这个“0”。这就是为什么我要问是否有办法在运行时检查错误,而不是检查 exitCode。
  • 在PowerShell中重写3000行批处理脚本肯定比调整3000行批处理脚本返回的退出代码更容易。

标签: powershell batch-file exit-code start-process


【解决方案1】:

为了让外部程序(例如您的 powershell 命令)了解批处理脚本运行时发生的情况,您需要将其实际编写到批处理文件中,以确定在某些错误期间应该发生什么。

例如,您的 powershell 示例只是启动批处理,等待它完成并回显您批处理退出的 last errorlevel,尽管在脚本期间您可能有许多不同的错误级别正在运行。

如果您的批处理在内部处理错误,例如下面的示例,您可以对其进行处理:

....
ping google.ca >nul
if %errorlevel% neq 0 (
exit /b %errorlevel%
) else (
....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2012-12-25
    • 1970-01-01
    • 2017-04-23
    • 2018-08-27
    • 1970-01-01
    相关资源
    最近更新 更多