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

时间:2015-01-21 19:38:13

标签: batch-file error-handling batch-processing errorlevel

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

1,我想放入一个脚本,当弹出错误信息时,该脚本会导致条目变为null。

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

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%

但似乎应该有一种更有效的方法来实现这一点,例如使用循环计算错误级别我设置errorlev = i其中i = 0并转到n。

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

1 个答案:

答案 0 :(得分:2)

首先,如果您要做的只是基于&#34; PROGRAM&#34;的零或非零退出代码的条件执行,请使用&&||来指定代码块成功或失败是这样的:

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.所以{{1}如果if ERRORLEVEL 5为8,则返回true。因此,系列%ERRORLEVEL%命令通常按降序编写。

if ERRORLEVEL