如何清除由外部CMDLET或可执行文件设置的$错误和$ lastExitCode



我有一个自定义模块包装外部命令(csrun.exe),然后解析输出,以便我可以在PowerShell中使用它。

除非外部命令写入 stderror

所有功能除了清除我的cmdlet中的错误似乎无法完全工作。它将清除(即$error.count0$lasterrorcode0,但是一旦我返回调用我的CMDLET的脚本,$error$lasterrorcode就不再清晰,$error参考中的错误是外部命令

的基础例外
System.Management.Automation.RemoteException: The compute emulator is not running.

我尝试过,尝试清除上述变量。无论如何,调用脚本保留了对错误的引用。

cuncommodule.psm1

$__azureEmulatorPath = "C:Program FilesMicrosoft SDKsAzureEmulator"SDKsAzureEmulator"
$__azureEmulator = __azureEmulatorPath + "csrun.exe"
function Get-EmulatorStatus() {
    [OutputType([ComputeEmulatorStatus])] 
    [cmdletbinding()]
    param()
    $output = (& $__azureEmulator /status | Out-String)
    if ($error.Count -gt 0 -or $LASTEXITCODE -ne 0) {
        Write-Host ($Error | Format-List -Force | Out-String)
        Write-Host Clearing Error and Continuing
        $error.Clear()
        $LASTEXITCODE = 0
    }
    #error from command cleared here
    return $output
}
export-modulemember -function *

test.ps1

import-module "CustomModule.psm1" # definew cmdlet Get-EmulatorStatus
$status = Get-EmulatorStatus
# even though error cleared in cmdlet, still here
Write-Host Write-Host Error $LASTEXITCODE, $Error.Count
Write-Host ($Error | Format-List -Force | Out-String)

尝试使用两个选项之一:

  • 使用 exit 从您的cmdlet,例如退出0 (首选)。
  • 明确设置代码时使用全局范围,例如 $ global:lastExitCode

我遇到了这个呼叫机器人,即使在成功之后,它也设置了非零退出代码,并干扰了詹金的自动化。

相关内容

最新更新