我尝试将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
答案 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
(我没有足够的声誉来发表评论)