При вызове сценария powershell из пакетного файла и выходе со значением, уровень ошибки равен 0 в пакетном файле, а не значением выхода - PullRequest
0 голосов
/ 05 июня 2019

При вызове сценария powershell из пакетного файла и выходе со значением, уровень ошибки равен 0 в пакетном файле, а не значением выхода

Я пытался использовать приведенный ниже код для вызова сценария powershell, который завершается с номером, который должен быть уровнем ошибки в пакетном файле, но когда я проверяю% errorlevel% в пакетном файле, он всегда равен нулю. Я вызываю его в цикле For, так как мне нужно, чтобы он возвращал некоторый текст.

Это скрипт powershell:

# TestReturnValAndCode.ps1
$DataIn = $args[0]
$ReturnVal="You passed in the text '" + $DataIn + "'"
$ReturnVal
exit 1234

Это командный файл:

:: testpscaller.bat
@echo off
set "BaseFolder=C:\temp\test"
set "TestPSScript=%BaseFolder%\TestReturnValAndCode.ps1"
set "TestValue=Test This Text"
for /f "delims=" %%a in ('powershell -executionpolicy bypass -file 
"%TestPSScript%" "TestValue"') do set "ReturnVal=%%a"
@echo ErrorLevel=[%ErrorLevel%]
@echo ReturnVal=[%ReturnVal%]

Это результат:

Равно = [0] ReturnVal = [Вы передали текст «TestValue»]

ErrorLevel должен быть 1234.

Что мне нужно сделать, чтобы получить и мое текстовое значение, и уровень ошибки (это не слишком клунки / клудги)

1 Ответ

0 голосов
/ 06 июня 2019

Команда for не не возвращает% errorlevel% от (последней) команды, выполненной внутри нее. Вам необходимо «преобразовать» такой% errorlevel% в текст внутри for тела, чтобы получить его как вторую строку вне for:

:: testpscaller.bat
@echo off
set "TestPSScript=.\TestReturnValAndCode.ps1"
set "ReturnVal="
for /f "delims=" %%a in ('powershell -executionpolicy bypass -file "%TestPSScript%" "TestValue" ^& echo %ErrorLevel%') do (
   if not defined ReturnVal (
      set "ReturnVal=%%a"
   ) else (
      set "ReturnErrorLevel=%%a"
   )
)
@echo ErrorLevel=[%ReturnErrorLevel%]
@echo ReturnVal=[%ReturnVal%]

Выход:

ErrorLevel=[1234]
ReturnVal=[You passed in the text 'TestValue']

EDIT

Это странно. Я сделал этот метод работы раньше. Однако, похоже, что команда echo %ErrorLevel%, размещенная внутри тела FOR, сообщает значение уровня ошибки, установленное последним выполнением powershell за пределами команды FOR ... Я не понимаю это поведение ... :(

Обходной путь - сохранить вывод powershell во временном файле:

:: testpscaller.bat
@echo off
set "TestPSScript=.\TestReturnValAndCode.ps1"
powershell -executionpolicy bypass -file "%TestPSScript%" "TestValue" > TempFile.txt
@echo ErrorLevel=[%ErrorLevel%]
set /P "ReturnVal=" < TempFile.txt
@echo ReturnVal=[%ReturnVal%]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...