gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:50:17 26 4
gpt4 key购买 nike

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

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

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

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 其中 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% 将返回 true是 8。因此, if ERRORLEVEL 的系列命令通常按降序编写。
if ERRORLEVEL 3 (
do stuff
) else if ERRORLEVEL 2 (
do something else
) else etc...

关于batch-file - 使用批处理脚本自动运行文件处理错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28075434/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com