使用批处理脚本自动处理文件 运行 的错误消息

Handling error messages with files run automatically with a batch script

我正在使用批处理脚本自动 运行 一些模拟和记录数据。 但是,因为这是出于测试目的,我经常会收到批处理脚本中弹出的错误消息,因为模拟软件中存在错误。我想在脚本中添加几个不同的东西,我对这两个东西的实现都非常模糊,因此我的问题。

1st,我想放入一个脚本,当错误消息弹出时,该脚本将导致条目变为空。

我有一个看起来像这样的循环

for /f "delims=_" %%J IN ('forfiles /p "%%F" /m *.ext/c "cmd /c echo @path"')  DO (
    set start=!time!
    start "PROGRAM"  /D "c:\Path\to\the\PROGRAM" /Wait program -r  %%J  

    rem This loop uses a regular expression to find the database name from the .ext file
    rem and sets it to a variable.
    for /f "tokens=3 delims=<>" %%a in  ('findstr "<Name>ABCDir" "%%~fJ"') do set name=%%a

set end=!time!

rem The following two loops convert start time and end time to centiseconds.
rem The time variable will be converted to minutes inside a sql query so that floats are possible.
for /F "tokens=1-4 delims=:.," %%a in ("!start!") do (
        set /a "start=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"
    )       

for /F "tokens=1-4 delims=:.," %%a in ("!end!") do (
        set /a "end=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"
    )

rem Calculate the elapsed time by subtracting values
set /A elapsed=end-start

sqlcmd -S SERVER -d DATABASE -v Var1 = "!name!" Var2 = "%variable2%" Var3 = !elapsed! Var4 = %variable4% -i "\path\to\the\query\Insert.sql"
)

所以我希望每次弹出错误消息时,脚本都会启动 运行 下一个文件并将 !elapsed! 变量更改为 null

但我还想添加一个脚本,该脚本将回显弹出的错误级别。我见过这样做的一种方法是这样的:

@ECHO OFF
IF ERRORLEVEL 1 SET ERRORLEV=1
IF ERRORLEVEL 2 SET ERRORLEV=2
IF ERRORLEVEL 3 SET ERRORLEV=3
IF ERRORLEVEL 4 SET ERRORLEV=4
   •
   •
   •
IF ERRORLEVEL 254 SET ERRORLEV=254
IF ERRORLEVEL 255 SET ERRORLEV=255
ECHO ERRORLEVEL = %ERRORLEV%

但似乎应该有一种更有效的方法来执行此操作,例如使用循环计算错误级别 i 设置 errorlev = i where i=0 并转到 n。

非常感谢你们提供的任何见解。

首先,如果您只想根据"PROGRAM"的零或非零退出代码进行条件执行,请使用&&||指定代码块成功或失败如下:

for /f "delims=_" %%J IN ('forfiles /p "%%F" /m *.ext/c "cmd /c echo @path"')  DO (
    set start=!time!
    start "PROGRAM"  /D "c:\Path\to\the\PROGRAM" /Wait program -r  %%J && (

        rem program exited status 0 (success)

        rem This loop uses a regular expression to find the database name from the .ext file
        rem and sets it to a variable.
        for /f "tokens=3 delims=<>" %%a in  ('findstr "<Name>ABCDir" "%%~fJ"') do set name=%%a

        set end=!time!

        rem The following two loops convert start time and end time to centiseconds.
        rem The time variable will be converted to minutes inside a sql query so that floats are possible.
        for /F "tokens=1-4 delims=:.," %%a in ("!start!") do (
            set /a "start=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"
        )       

        for /F "tokens=1-4 delims=:.," %%a in ("!end!") do (
            set /a "end=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"
        )

        rem Calculate the elapsed time by subtracting values
        set /A elapsed=end-start

        sqlcmd -S SERVER -d DATABASE -v Var1 = "!name!" Var2 = "%variable2%" Var3 = !elapsed! Var4 = %variable4% -i "\path\to\the\query\Insert.sql"

    ) || (

        rem Program exited status non-zero (fail)
        set "elapsed="
        rem Continue looping to next result of forfiles

    )
)

有关此类条件执行的更多信息,请参阅 this page

关于回显错误级别,它已经​​在%ERRORLEVEL%中了。您不必使用一系列 if ERRORLEVEL 语句来设置它。在命令行上试试这个:

cmd /c exit /b 5
echo %ERRORLEVEL%

它应该回显 5。

另外一个注意事项,虽然我不确定你是否仍然需要它知道你现在所知道的,if ERRORLEVEL N 检查 %ERRORLEVEL% 是否大于或等于 N。所以 if ERRORLEVEL 5 如果 %ERRORLEVEL% 为 8,则 return 为真。因此,一系列 if ERRORLEVEL 命令通常按降序编写。

if ERRORLEVEL 3 (
    do stuff
) else if ERRORLEVEL 2 (
    do something else
) else etc...