Для цикла и нескольких меток в пакетном скрипте - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь реализовать сценарий использования: когда я хочу обновить серию отчетов, каждый отчет при сбое должен попытаться выполнить снова, а затем отправить уведомление по электронной почте.

У меня естьПриведенные ниже вопросы, требующие помощи:

  1. В приведенном ниже коде, если моя первая команда (cmd [0]) выполнена успешно, Я не хочу, чтобы выполнить : erroremail section, но просто перейдите к выполнению второй команды (cmd [1]) вместо цикла.Как мне этого добиться?

  2. В основном, когда цикл 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
...