Как вернуть пользовательский уровень ошибок в PowerShell?

Я хочу запустить скрипт из командной строки и получить уровень ошибки. Я использую этот пакетный скрипт.

set log=C:\Users\PowerShell\XML\Log.txt
set PS=C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
set PS=%PS%\powershell.exe


"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" C:\Users\XML.ps1 -i C:\Users\A2.txt -j C:\Users\Fb.xml

echo %ERRORLEVEL% > "%log%"

Я попробовал этот скрипт, чтобы получить собственный уровень ошибок. Если он найден, он вернет 123, иначе 456. Но он всегда дает мне 1.

$regex = [regex]$Pattern
$matching = $regex.Match($FBString)
if ($matching.Success) {
    while ($matching.Success) {
        "Match found: {0}" -f $matching.Value
        Exit 123
        $matching = $matching.NextMatch()

    }
}
else {

    "Not Found"
    Exit 456

person Job    schedule 12.03.2019    source источник


Ответы (4)


Измените Exit на Return . Выход закроет ваш скрипт. Return вернет нужные вам значения.

person Ranadip Dutta    schedule 12.03.2019
comment
Он работает, когда я запускаю его из powershell. Но я хочу получить значение уровня ошибки с помощью пакетного файла - person Job; 12.03.2019
comment
0 означает, что сценарий выполнен успешно, а 1 означает, что произошла ошибка. Если вы хотите захватить одно и то же в пакетном режиме, вы должны перенаправить их на стандартный вывод. - person Ranadip Dutta; 12.03.2019
comment
( exit ‹n› ) установить системную переменную окружения %errorlevel%... в то время как ( return ‹n› ) попытается передать объект ‹n› вызывающему коду... или по умолчанию записать его в out-default. .. так что вы хотите использовать пакетные файлы или другие исполняемые файлы для вызова вашего кода powershell и взаимодействия с результатом стандартным способом ОС... вы должны использовать выход ‹n› ;-) - person ZEE; 09.08.2019

Вы можете написать логику в своем скрипте
, чтобы любая точка выхода устанавливала системную переменную %errorlevel%...

и создайте свою "логику возврата ошибки"...

что-то вроде этого:

if ( $LASTEXITCODE -eq 0 ) { exit 0  }
if ( $LASTEXITCODE -eq 1 ) { exit 1  }
if ( $x -gt 1 ) { exit 2  }
if ( $x -lt 1 ) { exit 3  }
...

а затем вы можете проверить из командного файла %errorlevel% == 0, 1, 2,...

person ZEE    schedule 09.08.2019

Запустите скрипт с помощью powershell -file. По умолчанию используется команда powershell. Как только этот сценарий завершится, с помощью -command сеанс продолжится.

person js2010    schedule 09.08.2019
comment
Большое спасибо! Это спасло мой день ... и должно быть принятым ответом (без переписывания сценариев, желаемый код выхода напрямую помещается в% errorlevel%). - person Binarus; 28.09.2020

Проблема в пакетном файле. Это должно быть так:

set log=C:\Users\PowerShell\XML\Log.txt
set PS=C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
set PS=%PS%\powershell.exe -ExecutionPolicy Bypass -File


"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -ExecutionPolicy Bypass -File C:\Users\XML.ps1 -i C:\Users\A2.txt -j C:\Users\Fb.xml

echo %ERRORLEVEL% > "%log%"

Для первого PowerShell скрипт уже правильный.

person Job    schedule 12.03.2019