从批处理文件调用Powershell脚本并退出并带有值时,批处理文件中的错误级别为0,而不是退出值

时间:2019-06-05 18:54:07

标签: powershell batch-file

从批处理文件调用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%]

这是结果:

ErrorLevel = [0] ReturnVal = [您输入了文本'TestValue']

ErrorLevel应该为1234。

我该怎么办才能同时获取文本值和错误级别(不是太笨拙/笨拙)

1 个答案:

答案 0 :(得分:0)

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']

编辑

这很奇怪。我以前做过这种方法。但是,似乎放置在FOR正文中的echo %ErrorLevel%命令报告了powershell outside 最后一次执行所设置的错误级别值...我不了解这种行为... :(

一种解决方法是将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%]