powershell $ lastexitcode在运行批处理文件时不起作用

时间:2015-11-20 11:14:53

标签: powershell batch-file

我尝试将bat文件中的exitcode / errorlevel代码放入调用bat文件的powershell脚本中。

尽管%ErrorLevel%是1:

BAT文件

call aCONFIGURATION
for %%f in (.\createData\*.g.sql) do sqlcmd -b -U %UserName% -P %Password% -S %sqlClonedServer% -d %sqlClonedDatabaseName%  -i %%f -r1 1> NUL
echo %ERRORLEVEL%

当我进入powershellscript时

$ lastexitcode总是0但%ErrorLevel%表示1

$build = "c:\my.bat"
$state = & $build
Write-Host $LASTEXITCODE

我正在把这个垃圾壳的毛发拉满虫子。

我已阅读这些链接,但由于结果不同,他们没有帮助:

如何修复$ lastexitcode

2 个答案:

答案 0 :(得分:2)

echo %ERRORLEVEL%只是将错误代码写入stdout,之后批处理文件正常退出。

如果您希望批处理脚本在退出时实际返回错误,请使用exit /b [exitcode]

call aCONFIGURATION
for %%f in (.\createData\*.g.sql) do sqlcmd -b -U %UserName% -P %Password% -S %sqlClonedServer% -d %sqlClonedDatabaseName%  -i %%f -r1 1> NUL
exit /b %ERRORLEVEL%

答案 1 :(得分:0)

我同意提供的修复程序,但我认为更多的解释会有所帮助。

在BAT中,有2个退出值:ERRORLEVEL和退出代码。通常,BAT文件尊重ERRORLEVEL。

从CMD提示符运行时,BAT文件将正确返回一个非零的ERRORLEVEL,而不带“ EXIT / B%ERRORLEVEL%”语句,但返回的退出代码将为0。

问题是,从PowerShell运行BAT文件时,$ LASTEXITCODE使用的是最后一个退出代码,而不使用最后的ERRORLEVEL。我认为BAT文件中的FOR语句将退出代码设置为0,但未设置ERRORLEVEL。添加“ EXIT / B%ERRORLEVEL%”设置退出代码以匹配ERRORLEVEL。

示例显示FOR将退出代码设置为0:

@ECHO OFF
REM Enable !VAR! expansion
SETLOCAL ENABLEDELAYEDEXPANSION

REM Reset ERRORLEVEL to 0
VERIFY > NUL

REM DIR a file that doesn't exist, 3 times, with all output redirected to NUL
REM If the DIR sets the exit code to non-zero then print FAILED1.
REM If the exit code of the FOR statement is 0 then print PASSED1.
FOR /L %%i IN (1,1,3) DO (
  DIR doesntexist.txt 2>1 > NUL || ECHO FAILED1
  ECHO ERRORLEVEL1 !ERRORLEVEL!
) && ECHO PASSED1

ECHO ERRORLEVEL2 %ERRORLEVEL%
EXIT /B %ERRORLEVEL%

这是一个长期存在的棘手问题。参见:Batch goto loses errorlevel

(我没有足够的声誉来发表评论)