如何在Powershell中传播执行状态($?)?例如,假设函数内部的命令失败(因此$?
为$FALSE
)。您如何使函数本身也失败(因此$?
为$FALSE
)。
function gitpush() {
git.exe push @Args
}
gitpush
Write-Output $?
执行命令$?
后说$FALSE
为git.exe push @Args
。执行功能$?
后,$TRUE
将是gitpush
。在执行功能$?
之后,如何传播$FALSE
使其gitpush
?
我找到的最接近的解决方案是在这里:PowerShell: detecting errors in script functions
实施上述示例的解决方案如下所示:
function gitpush() {
git.exe push @Args
if (!$?) {
$PSCmdlet.WriteError($Global:Error[0])
}
}
gitpush
Write-Output $?
但是,由于$Global:Error[0]
为空,因此在这种情况下不起作用:
You cannot call a method on a null-valued expression.
At line:4 char:1
+ $PSCmdlet.WriteError($Global:Error[0])
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
$?
是只读的,因此无法明确设置:
function gitpush() {
git.exe push @Args
if (!$?) {
$? = $FALSE
}
}
gitpush
Write-Output $?
输出:
Cannot convert the "System.Management.Automation.InvocationInfo" value of type "System.Management.Automation.InvocationInfo" to type "System.Management.Automation.PSBoundParametersDictionary".
At line:4 char:1
+ gph; echo $?;
+ ~~~
+ CategoryInfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : ConvertToFinalInvalidCastException
答案 0 :(得分:0)
在@AnsgarWiechers的基础上,只需在函数中放入Throw
语句
function gitpush() {
git.exe push @Args
if (!$LastExitCode) {
Throw $Error
}
}