как я могу вызвать пакетную команду несколько раз до успеха? - PullRequest
1 голос
/ 01 августа 2011

У меня есть командный файл, который вызывает различные команды, некоторые из которых иногда могут произойти сбой из-за проблем с сетью.Повторная попытка команды, как правило, приводит к успеху.

Как я могу автоматически повторять попытки команд, до заданного количества попыток?

Вот некоторый псевдокод, предназначенный дляобъясни дальше

call:try numTries "command and arguments"
exit

:try
REM execute %2, trying upto %1 times if it fails
%1 = %1 -1
eval %2
if %errorlevel%==0 exit \B
if %1 > 0 goto try
exit \B

Ответы [ 4 ]

2 голосов
/ 27 марта 2019

без eval и> (в значительной степени скопируйте макароны ответа MatsT)

REM execute %2, trying upto %1 times if it fails
set count=%1
set command=%2
:DoWhile
    if %count%==0 goto EndDoWhile
    set /a count = %count% -1
    call %command%
    if %errorlevel%==0 goto EndDoWhile
    if %count% gtr 0 goto DoWhile
:EndDoWhile
2 голосов
/ 01 августа 2011

Следующий скрипт будет тем, что вы ищете:

CALL :try <i>numTries</i> "<i>command and arguments</i>"
GOTO :EOF


:try
SET /A tries=%1

:loop
IF %tries% LEQ 0 GOTO return

SET /A tries-=1
EVAL %2 && (GOTO return) || (GOTO loop)

:return
EXIT /B

Логика подпрограммы try такова:

  1. Сохранитеколичество попыток в переменной.

  2. Начать цикл.Проверьте переменную tries.Если 0 или меньше, вернуть.

  3. Оценить команду и аргументы.

  4. Если возвращаемое значение равно «success» (ERRORLEVEL равно 0), возврат (из подпрограммы try), в противном случае перейдите к # 2 (начало цикла).

0 голосов
/ 22 ноября 2012

Зомби возникает.

Подумайте только об использовании:

START /wait "command and arguments"
0 голосов
/ 01 августа 2011

Попробуйте что-то вроде:

SETLOCAL EnableDelayedExpansion
call:try numTries "command and arguments"
exit

:try
    REM execute %2, trying upto %1 times if it fails
    set count = %1
    set command = %2
    :DoWhile
        if %count%==0 goto EndDoWhile
        set count = %count% -1
        eval %command%
        if %errorlevel%==0 goto EndDoWhile
        if %count% > 0 goto DoWhile
    :EndDoWhile
exit \B

EnableDelayedExpansion - это способ оценки переменных во время выполнения, а не во время разбора.Без этого невозможно сохранить обновление счетчика в цикле.В противном случае большая часть кода выглядит уже работающей.Я бы не рекомендовал обновлять сами переменные аргумента, так как обычно безопаснее и менее запутанно запускать функцию, копируя их в другие переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...