@ECHO OFF
SET output=%USERPROFILE%\output.txt
IF EXIST "%output%" DEL "%output%"
FOR /L %%G IN (1, 1, 69) DO (
CALL :ping 192.168.%%G.3
CALL :ping 192.168.%%G.4
)
GOTO :EOF
:ping
ping -n 1 %1 >NUL && ECHO %1>>"%output%"
В основном вы используете &&
для добавления команды, которая выполняется только в том случае, если предыдущая команда (та, которая была перед &&
) успешно выполнена (технически говоря, вернул код выхода 0
).
Есть аналогичный подход для противоположного случая. Если вы хотите выполнить некоторые действия с неудачным результатом команды, вы должны поставить ||
после нее, а затем команду, реализующую ваше действие.
EDIT
Одна заметка о ping
. Иногда вы получаете уведомление от маршрутизатора, что хост недоступен. В этом случае ping
по-прежнему завершается с кодом 0
(«успешно»), потому что он получает ответ, даже если он от маршрутизатора, а не от фактического хоста.
Если это может иметь место с вашими хостами, и вы не хотите, чтобы в выходном файле были такие ложные срабатывания, вам придется проанализировать вывод ping
для некоторых ключевых слов, чтобы определить, действительно ли проверка прошла успешно , До сих пор вы можете полагаться на строки, показывающие совокупную статистику: они появляются, только если ответ был от предполагаемого хоста.
Итак, вот альтернативный подход:
@ECHO OFF
SET output=%USERPROFILE%\output.txt
IF EXIST "%output%" DEL "%output%"
FOR /L %%G IN (1, 1, 69) DO (
CALL :ping 192.168.%%G.3
CALL :ping 192.168.%%G.4
)
GOTO :EOF
:ping
ping -n 1 %1 | find "Approximate round trip" >NUL && ECHO %1>>"%output%"
РЕДАКТИРОВАТЬ 2
Изменено в обоих решениях использование вызова подпрограммы во избежание преждевременного расширения %ip%
внутри цикла for
. (Также может быть исправлено включением отложенного расширения.)
Также цитируется %output%
везде.