Я пытаюсь реализовать сценарий использования: когда я хочу обновить серию отчетов, каждый отчет при сбое должен попытаться выполнить снова, а затем отправить уведомление по электронной почте.
У меня естьПриведенные ниже вопросы, требующие помощи:
В приведенном ниже коде, если моя первая команда (cmd [0]) выполнена успешно, Я не хочу, чтобы выполнить : erroremail section, но просто перейдите к выполнению второй команды (cmd [1]) вместо цикла.Как мне этого добиться?
В основном, когда цикл for завершается (когда все мои команды выполняются), я не хочу выполнять метку : erroremail впоследний .Я хочу, чтобы он выполнялся только в случае сбоя любой команды во 2-й попытке.Если для решения этой проблемы я использую exit 0 в конце цикла for, код завершается сразу после запуска первой команды cmd [0].Какая альтернатива?
**SetLocal EnableDelayedExpansion
SET cmd[0]=run the report 1
SET cmd[1]=run the report 2
SET attempt[0]=1
SET attempt[1]=2
SET /A "fail = 1"
@echo off
for /F "tokens=2 delims==" %%s in ('set cmd[') do (
for /F "tokens=2 delims==" %%a in ('set attempt[') do (
if !fail! equ 1 (
`@REM ----run commands`
%%s >>%LOGFILE% 2>>&1
if not %errorlevel%==0 (set errmsg=Unable to run& call :Problem)
`@REM ----check if the command is successful`
for /f "usebackq delims=" %%b in (%LOGFILE%) do set lastline=%%b
echo !lastline! | findstr /I /R /C:"Finished refresh of extracts" >nul
`@REM ----command is successful`
if !errorlevel!==0 (
SET /A "fail = !fail! + 1"
)
)
`@REM ----command is failed`
if not !errorlevel!==0 (if %%a equ 2 (
set errmsg=2nd attempt for refresh
call :erroremail
))
)
)
:erroremail
echo "error email is sent after 2nd attempt"
EXIT /b
:Problem
echo "entering problem"
EXIT 1