2012-01-17 2 views
4

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

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

Теперь единственная проблема, я хотел бы также установить $? для $ false. Это возможно?

+0

я не получаю то, что вы хотеть. $? является readonly и не может быть изменен. – mjsr

+0

Ну как я могу указать, что функция, возвращаемая с ошибкой, которая сделает readonyl переменную $? быть ложным? –

+1

Ouu теперь я получаю то, что вы хотите, у меня такая же самая точная потребность, когда я создаю оболочку для Out-Default, чтобы автоматически сохранять последний объект в некоторой переменной и отвечать на URL-адреса (идея взята из Powershell In Action 2). Эта идея была великолепна, но я ввернул $? переменная. Обходной путь, который я использовал, это создать персонализированную переменную $ MyErrorIndicator, мне не нравится слишком много, но это единственное, что приходит мне на ум, чтобы сохранить эти новые функции. – mjsr

ответ

6

От Bruce Payettes' PowerShell In Action (Second Edition):

в $? переменная будет истинна, если вся операция выполнена успешно, а 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 
+0

Энди, эта половина отвечает на мой вопрос. Как я могу получить сообщение об ошибке в конвейере? Нужно ли мне бросать исключение? Если так, я беру его, возвращение объекта невозможно. –

+0

@JustinDearing Использование Я представил пример использования командлета сценария. –

+3

Если вы посмотрите на разделы «Методы ошибок» и «Способы записи» в записи справки PowerShell для «about_Functions_Advanced_Methods» (используя «Get-Help about_Functions_Advanced_Methods» в PowerShell), вы можете найти дополнительную информацию о методе, который @Andy предоставил в его ответе. В частности, ссылка на службу PowerShell ссылается на следующую полезную статью MSDN: [PSCmdlet.WriteError Method] (http://go.microsoft.com/fwlink/?LinkId=142157). Я упоминаю об этом просто потому, что я нашел объяснение MSDN функции '$ PSCmdlet.WriteError' полезным при чтении этого ответа. – Jeffrey

Смежные вопросы