从批处理文件调用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。
我该怎么办才能同时获取文本值和错误级别(不是太笨拙/笨拙)
答案 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%]