Распространить статус выполнения - PullRequest
0 голосов
/ 18 июня 2019

Описание

Как вы распространяете статус выполнения ($?) В Powershell? Например, допустим, что команда внутри функции не выполнена (поэтому $? равно $FALSE). Как сделать так, чтобы сама функция тоже не работала (чтобы $? было $FALSE).

Пример

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

gitpush
Write-Output $?

Скажите $? = $FALSE после выполнения команды git.exe push @Args. $? будет $TRUE после выполнения функции gitpush. Как заставить $? распространяться так, чтобы $FALSE после выполнения функции gitpush?

Попытки решения

Ближайшее решение, которое я нашел здесь: PowerShell: обнаружение ошибок в функциях скрипта

Реализация этого решения в предыдущем примере будет выглядеть так:

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 голосов
/ 18 июня 2019

Опираясь на @AnsgarWiechers, просто поместите оператор Throw внутри своей функции

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