Как я могу получить powershell, чтобы вернуть правильный код выхода при вызове с аргументом -File?

Powershell возвращает код выхода 0, когда произошла ошибка, если вызвана с аргументом -File. Это означает, что моя сборка зеленая, когда она не должна быть: (

Например:

(в wtf.ps1)

$ErrorActionPreference = "Stop";   
$null.split()

(cmd)

powershell -file c:\wtf.ps1  
You cannot call a method on a null-valued expression.
At C:\wtf.ps1:3 char:12
+ $null.split <<<< ()
    + CategoryInfo          : InvalidOperation: (split:String) [], ParentConta
   insErrorRecordException
    + FullyQualifiedErrorId : InvokeMethodOnNull


echo %errorlevel%  
0

powershell c:\wtf.ps1  
You cannot call a method on a null-valued expression.
At C:\wtf.ps1:3 char:12
+ $null.split <<<< ()
    + CategoryInfo          : InvalidOperation: (split:String) [], ParentConta
   insErrorRecordException
    + FullyQualifiedErrorId : InvokeMethodOnNull


echo %errorlevel%  
1

Любые идеи?

(Я пробовал почти каждую идею с первых двух страниц этого: https://www.google.co.uk/search?q=powershell+file+argument+exit+code уже)

Ответы

Ответ 1

В script используйте ключевое слово exit с номером по вашему выбору:

exit 34

Здесь script я использовал это:

## D:\Scripts\Temp\exit.ps1 ##
try{
    $null.split()
}
catch
{
    exit 34
}

exit 2
#############################

# launch powershell from cmd 
C:\> powershell -noprofile -file D:\Scripts\Temp\exit.ps1
C:\>echo %errorlevel%
34

Ответ 2

известная проблема. Методы обхода вызывают script с помощью -File, используя параметр -Command (и добавляя; выходят $lastexitcode, если у вас также есть свои собственные коды выхода) или превращая их в коды выхода, такие как Shay, или пример использования ловушки ниже. Подробнее см. здесь.

trap
{
    $ErrorActionPreference = "Continue";   
    Write-Error $_
    exit 1
}

$ErrorActionPreference = "Stop";   
$null.split()