Пакетный файл - ping цикла - вывод файловых хостов, которые работают - PullRequest
4 голосов
/ 18 февраля 2011

Я хотел бы создать файл .bat, который будет выполнять цикл for, как показано ниже:

@echo off
FOR /L %%G IN (1, 1, 69) DO (
    ping -n 1 192.168.%%G.3 
    ping -n 1 192.168.%%G.4
)

Затем просмотрите выходные данные и отправьте только те IP-адреса, которые успешно ответили на эхо-запрос, в текстовый файл. Возможно ли это с командным файлом CMD?

Ответы [ 2 ]

6 голосов
/ 18 февраля 2011
@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% везде.

0 голосов
/ 16 июня 2013
@echo off
:A
FOR /L %%G IN (1, 1, 69) DO (
    ping -n 1 192.168.%%G.3 
    ping -n 1 192.168.%%G.4
)
:GoTo
...