Описание
Как вы распространяете статус выполнения ($?) В 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