От Брюса Пайетта 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