传播执行状态

时间:2019-06-18 16:47:31

标签: function powershell error-handling

说明

如何在Powershell中传播执行状态($?)?例如,假设函数内部的命令失败(因此$?$FALSE)。您如何使函数本身也失败(因此$?$FALSE)。

示例

function gitpush() {
    git.exe push @Args
}

gitpush
Write-Output $?

执行命令$?后说$FALSEgit.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  

1 个答案:

答案 0 :(得分:0)

在@AnsgarWiechers的基础上,只需在函数中放入Throw语句

function gitpush() {
    git.exe push @Args
    if (!$LastExitCode) {
        Throw $Error
    }
}