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