&&
и ||
работают только с успешным статусом команды, что отражено в automati c $?
переменная (как вы указываете) - что не связано с тем, что команда выводит (возвращает).
Функции и скрипты сообщают $?
как $true
, если не было предпринято явных действий; то есть, даже если команды, используемые внутри скрипта / функции, терпят неудачу, $?
по-прежнему $true
при выходе из скрипта / функции.
К сожалению, в PowerShell 7.0 прямого пути нет для функции , чтобы напрямую установить $?
на $false
, хотя планируется добавить такую функцию - см. в этом GitHub .
В сценарии использование exit
с ненулевым кодом выхода, однако, эффективно (это приводит к тому, что $LASTEXITCODE
отражает код выхода, а механизм PowerShell устанавливает $?
на $false
, если код выхода отличен от нуля - это также то, как это работает, когда вы вызываете внешние программы ).
На данный момент существует только следующий неоптимальный обходной путь для функций; он субоптимален в том смысле, что неизменно выдает сообщение об ошибке :
function no {
# Make the function an advanced one, so that $PSCmdlet.WriteError()
# can be called.
[CmdletBinding()]
param()
# Call $PSCmdlet.WriteError() with a dummy error, which
# sets $? to $false in the caller's scope.
# By default, this dummy error prints and is recorded in the $Error
# collection; you can use -ErrorAction Ignore on invocation to suppress
# that.
$PSCmdlet.WriteError(
[System.Management.Automation.ErrorRecord]::new(
[exception]::new(), # the underlying exception
'dummy', # the error ID
'NotSpecified', # the error category
$null) # the object the error relates to
)
}
Функция no
теперь устанавливает $?
в false, что вызывает ветвь ||
; -EA Ignore
(-ErrorAction Ignore
) используется для отключения фиктивной ошибки.
PS> no -EA Ignore || 'no!'
no!