2015-08-22 4 views
6

Я все еще использую пакетные файлы Windows для выполнения основных задач. Один из них - проверить мое подключение к Интернету (pg.bat), которое делает толькоКак запустить команду, пока она не удастся?

В большинстве случаев мне нужно запустить его несколько раз, пока он не удастся (хост не может найти ошибку). Сначала я подумал, что будет работать ping -t, но это не так. Когда хост не найден, он сразу останавливается.

Как запустить pg.bat до тех пор, пока ping не удастся? (То есть по крайней мере один из по умолчанию 4 Pings работ в)

ответ

5

В общем, вы можете использовать метки/Гото синтаксиса в пакетном файле.

:repeat 
your-command || goto :repeat 
echo Success! 

|| будет только запустить вторую команду, если первый один выходит из строя. Отказ в этом случае означает ненулевой код выхода, поэтому он будет работать только с командами, которые устанавливают %errorlevel% в 0 для успеха или ненулевого для отказа.

Для конкретного случая ping.exe код выхода не всегда отличен от нуля при сбое. В этом случае вы можете использовать find.exe для поиска вывода ping для успешного сообщения и установки уровня ошибок, как нам нужно.

:repeat 
(ping -n 1 www.google.com | find "TTL=") || goto :repeat 
echo Success! 

(благодаря Stephan для объяснения и решения относительно ping.exe кодов выхода)

+2

'% errorlevel%' of 'ping' не является надежным (" ответ от : destination not reachable' "дает'% errorlevel% '= 0). Поэтому лучше использовать уровень ошибок '... | найти "TTL" ' – Stephan

+0

Понял. Для конкретного случая, когда команда 'ping', ваш ответ более полный. Мое намерение состояло в том, чтобы проиллюстрировать команду 'command || do-on-error', чтобы ответить на более общий вопрос: «Как запустить команду, пока она не удастся?». В качестве альтернативы OP может изменить заголовок вопроса на «Как запустить ping.exe, пока он не удастся». –

+0

@ RyanBemrose вы правы, потому что более общий вопрос лучше ответил на ваш. – Burkhard

3

просто цикл команды, пока он не успешен:

:Loop 
ping -n 1 www.google.com | find "TTL=" 
if not %errorlevel% equ 0 goto :Loop 
echo Connection established 
0

Вы должны поместить вашу команду в цикле, как показано ниже:

:Loop 
ping -n 1 www.google.com | find "TTL=" 
if %errorlevel% neq 0 goto :Loop 
echo Connection established 

Ум оператор neq выше. Это оператор «не равен» в командной строке Scripting.

Смежные вопросы