如何清除外部cmdlet或可执行文件设置的$ error和$ LASTEXITCODE?

And*_*org 1 powershell

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

除了外部命令写入stderror以及清除cmdlet中的错误之外,所有内容都可以正常工作.这将清除(即$error.count0$lasterrorcode0,但一旦我回到那个是叫我的小命令的脚本,$error$lasterrorcode不再清晰,错误$error引用的外部命令的底层异常

System.Management.Automation.RemoteException: The compute emulator is not running.
Run Code Online (Sandbox Code Playgroud)

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

CustomModule.psm1

$__azureEmulatorPath = "C:\Program Files\Microsoft SDKs\Azure\Emulator\"SDKs\Azure\Emulator\"
$__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 *
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

Mat*_*ore 9

尝试使用以下两个选项之一:

  • 使用出口从你的小命令,比如退出0(首选).
  • 在显式设置代码时使用全局范围,例如 $ global:LASTEXITCODE

我遇到了这个调用robocopy,即使成功也设置了非零退出代码,并干扰了Jenkin的自动化.