Я выполняю пакетный файл с помощью TaskScheduler «При запуске системы» на Windows Server 2012 в Azure, и я заметил, что в течение 20-60 секунд после запуска пакета нет сети. В настоящее время я добавил постоянное ожидание с пингом, и он работает большую часть времени, но иногда нет. Можете ли вы предложить мне более надежный способ подождать, пока сеть не станет доступной? (для отправки электронной почты и / или HTTP-запросов)
Кажется, вы намерены использовать для этого пакетную обработку, так что приступим. Возможно, вам захочется запустить это ребятами из SO, поскольку они лучшие сценаристы, чем я. Собственно, основную логику я получил из (https://stackoverflow.com/questions/21245545/ping-test-using-bat-file-trouble-with-errorlevel) с указанием причины, по которой проверка того, будет ли пинг проходить с помощью этого метода, предпочтительнее других.
@echo off
set IPaddress=%%1 REM add IP address as command line argument or just static
:TEST
ping -n 1 %IPaddress% | find "TTL=" >nul
if errorlevel 1 (
goto RETRY
) else (
goto DOSTUFF
)
:RETRY
ping 127.0.0.1 -n 11>nul REM waits given amount of time, set to 10 seconds
goto TEST
:DOSTUFF
do stuff REM Do stuff
exit
По сути, он просто пингует с интервалом в одну секунду, проверяет, произошел ли успешный пинг. Если это так, он делает то, что вы пытаетесь написать.
Я не кодировал IP-адрес, для которого вы хотите проверить базовое соединение ICMP, а вместо этого добавил его в качестве аргумента командной строки. Или вы можете просто его жестко запрограммировать.
Возможно, вы захотите дважды проверить синтаксис, поскольку я вообще этого не тестировал.
РЕДАКТИРОВАТЬ: изменено значение пинга на 11, чтобы отразить реальную 10-секундную задержку.
Используйте опцию «Запускать, только если это сетевое соединение доступно».
В соответствии с этот ответ на суперпользователя, вы можете подписать запланированное задание на событие «сеть доступна».
Я думаю, что это должно работать, если вы не фильтруете по конкретной сети.