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