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

除了外部命令写入stderror以外,几乎所有内容都可以正常工作,并且清除cmdlet中的错误似乎并不完全有效。它将清除(即$error.count0$lasterrorcode0,但是一旦我返回调用我的cmdlet的脚本,就不再清除$error$lasterrorcode,并且$error中的错误引用了外部命令的基础异常

System.Management.Automation.RemoteException: The compute emulator is not running.

我已经尝试过,尝试捕捉,清除了提到的变量。无论如何,调用脚本都会保留对错误的引用。

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 *

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)

最佳答案

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

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

  • 我遇到了这种调用robocopy,即使成功,它也会设置非零退出代码,并且干扰了Jenkin的自动化。

    关于powershell - 如何清除由外部cmdlet或可执行文件设置的$ error和$ LASTEXITCODE?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41306657/

    10-14 15:54