如何使powershell函数返回一个对象并设置$?到$ false?

时间:2012-01-17 20:46:15

标签: powershell error-handling

我在powershell函数中有一些代码如下:

try {
    Invoke-SomethingThatFails
}
catch [System.Exception] {
    Write-Error $_.Exception.Message;
    return New-Object Namespace.CustomErrorType -Property @{
        'Code' = "Fail";
        "Message" = $_.Exception.Message;
    }
}

现在唯一的问题是我还想设置$?是$ false。这可能吗?

1 个答案:

答案 0 :(得分:6)

来自Bruce Payettes'PowerShell In Action (Second Edition)

  

$?如果整个操作成功,变量将为true   否则是假的。例如,如果任何操作写入错误   对象,那么$?即使错误被丢弃,也将设置为false   使用重定向。这是一个重点:它意味着一个脚本   可以确定是否发生错误,即使错误不是   显示。

PowerShell运行时管理$?的值,并在管道中写入错误对象时设置为false。

更新以下是如何将错误对象写入管道但不终止它(管道):

function New-Error {
    [CmdletBinding()]
    param()
    $MyErrorRecord = new-object System.Management.Automation.ErrorRecord `
        "", `
        "", `
        ([System.Management.Automation.ErrorCategory]::NotSpecified), `
        ""
    $PSCmdlet.WriteError($MyErrorRecord)
}

$Error.Clear()
Write-Host ('$? before is: ' + $?)
New-Error
Write-Host ('$? after is: ' + $?)

输出:

$? before is: True

New-Error : 
At C:\...\....ps1:14 char:10
+ New-Error <<<< 
    + CategoryInfo          : NotSpecified: (:String) [New-Error], Exception
    + FullyQualifiedErrorId : New-Error

$? after is: False