Как заставить функцию powershell вернуть объект и установить $? в $ false? - PullRequest
4 голосов
/ 18 января 2012

У меня есть некоторый код в функции powershell, который выглядит следующим образом:

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

Теперь единственная проблема - я бы тоже хотел установить $? быть ложным. Возможно ли это?

1 Ответ

6 голосов
/ 18 января 2012

От Брюса Пайетта PowerShell в действии (второе издание) :

The $?переменная будет true, если вся операция прошла успешно, и false в противном случае.Например, если какая-либо из операций записала объект ошибки, то $?будет установлен в false, даже если ошибка была отклонена с помощью перенаправления.Это важный момент: это означает, что сценарий может определить, произошла ли ошибка, даже если ошибка не отображается.

Среда выполнения PowerShell управляет значением $? и имеет значение falseкогда объект ошибки записывается в конвейер.

Update Вот как можно записать объект ошибки в конвейер, но не завершить его (конвейер):

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...