我正在使用批处理脚本自动运行一些模拟和记录数据。 但是,因为这是为了测试的目的,我经常收到从批处理脚本弹出的错误消息,因为模拟软件中存在错误。我想在脚本中添加几个不同的东西,这两个都在实现上非常模糊,因此我的问题。
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。
我非常感谢你们能提供的任何见解。
答案 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