我在powershell函数中有一些代码如下:
try {
Invoke-SomethingThatFails
}
catch [System.Exception] {
Write-Error $_.Exception.Message;
return New-Object Namespace.CustomErrorType -Property @{
'Code' = "Fail";
"Message" = $_.Exception.Message;
}
}
现在唯一的问题是我还想设置$?是$ false。这可能吗?
答案 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