首页 > 解决方案 > 从 PowerShell 运行批处理文件时出现意外的退出代码

问题描述

我在 Microsoft Windows 环境中调用一个.bat文件Powershell,并且想知道退出代码是成功还是失败。

在这种不寻常的(尽管不是很不寻常)边缘情况下似乎出现了问题。

示例 #1:

.\test1.bat

ECHO ON
setlocal enabledelayedexpansion
False
if !errorlevel! neq 0 exit /b !errorlevel!
echo "More text"

这工作正常。False导致错误;下一行检查状态,看到 a1exits 和 code 1。调用powershell有正确的结果。echo $LASTEXITCODE 1

示例 #2:

.\test2.bat

ECHO ON
setlocal enabledelayedexpansion
if "testing" == "testing" (
    False
    if !errorlevel! neq 0 exit /b !errorlevel!
    echo "More text"
    echo "More code"
    True
    if !errorlevel! neq 0 exit /b !errorlevel!
    echo "More code"
)

这就是困难所在。False导致错误;下一行检查状态,看到 a 1,并以 code 退出1。然后,调用powershell有一个意想不到的结果,echo $LASTEXITCODE0

只能修改批处理文件来解决问题吗?

标签: powershellbatch-filecmd

解决方案


当从外部(例如 PowerShell)调用批处理文件时,您会看到有问题的cmd.exe行为,它们的退出代码不能可靠地作为进程退出代码中继 cmd.execmd.exe

有关背景信息,请参阅此答案

解决方法

  • 按如下方式调用您的批处理文件:

    cmd /c '.\test2.bat & exit'
    
  • 或者,如果可以选择安装第三方模块(由我编写),请使用模块 ( ) 中的ie函数,这还可以补偿 PowerShell 向外部程序传递参数的损坏(请参阅此答案):NativeInstall-Module Native

    # Assuming `Install-Module Native` was run:
    ie .\test2.bat
    

推荐阅读