Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] пропинговать ip адреса заданные в txt файле (http://forum.oszone.net/showthread.php?t=325948)

baradan2000 14-04-2017 17:26 2729302

пропинговать ip адреса заданные в txt файле
 
Задача такая: необходимо пропинговать ip адреса заданные в txt файле списком и те адреса по которым пинг есть вынести в отдельный файл с именем компьютера и ip адресом. Проблем с массовым пингом не возникло, а вот вынести в файл не получается. Вот код:
Код:

FOR /F %%A IN (ips.txt) DO ping -n 1 -a %%A  | find /i  "domen.name" >> C:\ips_prom_res.txt
FOR /F "delims=:" %%B IN (ips_prom_res.txt) DO  set B=B:~0,4 echo B  >> C:\ips_result.txt

В ips_prom_res.txt заносится промежуточный результат, там всё в порядке. Далее нужно из каждой строки отсечь лишнее и полученный результат занести в ips_result.txt и вот хоть убей не пойму как это сделать.

megaloman 15-04-2017 20:29 2729644

Цитата:

Цитата baradan2000
те адреса по которым пинг есть вынести в отдельный файл с именем компьютера и ip адресом

Фраза совершенно непонятна: то ли надо получить один текстовый файл с перечислением имен компьютеров и ip, то ли для каждого ip создать отдельный txt-файл.
Вот вариант с одним текстовым файлом
Код:

@Echo Off
cls

chcp 437 >nul

Set "FileIp=ips.txt"
Set "FileOut=%~dpnx0.ips.txt"

Del "%FileOut%" 2>nul
FOR /F "usebackq" %%p IN ("%FileIp%") DO Call :Pinguin "%%p"

GoTo :Eof

:Pinguin
        Echo %~1
        FOR /F "usebackq skip=1 tokens=2,3 delims= " %%i IN (`ping -4 -n 1 -a %~1`) DO (
                If /I "%%j"=="[%~1]" Echo %%i %%j>>"%FileOut%"
                GoTo :Eof
        )
GoTo :Eof

У меня комп не в домене, команда ping нигде не выдаёт строку "domen.name". Поэтому возможно этот мой вариант у Вас не отработает.
Хотелось бы получить от Вас файл после выполнения батника для нескольких пингующихся и непингующихся узлов
Код:

@Echo Off
chcp 437 >nul

>ips_prom_res.txt (FOR /F %%A IN (ips.txt) DO ping -4 -n 1 -a %%A)

У меня выдача ping имеет вид
Код:

Pinging My_Comp_Name [192.168.1.5] with 32 bytes of data:
Reply from 192.168.1.5: bytes=32 time<1ms TTL=128

Ping statistics for 192.168.1.5:
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

Pinging My_Comp_Name [127.0.0.1] with 32 bytes of data:
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

Ping statistics for 127.0.0.1:
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

Pinging 192.168.1.55 with 32 bytes of data:
Reply from 192.168.1.5: Destination host unreachable.

Ping statistics for 192.168.1.55:
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),

Pinging 111.111.111.111 with 32 bytes of data:
Request timed out.

Ping statistics for 111.111.111.111:
    Packets: Sent = 1, Received = 0, Lost = 1 (100% loss),


baradan2000 17-04-2017 09:14 2729995

Спасибо, первый вариант работает.
В файл попали и те ip по которым есть пинг и те которые без пинга, но были в DNS, т.е. пинга нет, но вернул строку с ip и доменным именем компа.
Можете пояснить по коду, а то не давно начал постигать азы?

megaloman 17-04-2017 11:40 2730057

Цитата:

Цитата baradan2000
В файл попали и те ip по которым есть пинг и те которые без пинга, но были в DNS

Если Вас это не удовлетворяет, попробуйте этот вариант, полностью его проверить мне не на чем, я не в домене
Код:

@Echo Off
cls

chcp 437 >nul

Set "FileIp=ips.txt"
Set "FileOut=%~dpnx0.ips.txt"

Del "%FileOut%" 2>nul
FOR /F "usebackq" %%p IN ("%FileIp%") DO Call :Pinguin "%%p"

GoTo :Eof

:Pinguin
        Echo %~1
        Set "OutString="
        Set "OutTTL="
        FOR /F "usebackq skip=1 tokens=1,2,3,7 delims== " %%i IN (`ping -4 -n 1 -a %~1`) DO (
                If /I "%%k"=="[%~1]" Set "OutString=%%j %%k"
                If /I "%%l"=="TTL" Set "OutTTL=TTL"
                If /I "%%i"=="Reply" GoTo :Continue

        )
        :Continue
        If Not "%OutString%"=="" If Not "%OutTTL%"=="" Echo %OutString%>>"%FileOut%"
GoTo :Eof

Попробую объяснить, как это работает


Для обработки IP из списка текстового файла написал процедуру, в неё в виде аргумента передаётся IP.
Call :Pinguin "%%p"


Выдача ping обрабатывается в FOR (смотрите хелп FOR /?) для переданного в процедуру IP %~1
Первая строка ping пустая, мы её пропускаем ( skip=1 )
Выдачу ping разбираем на подстроки, в качестве разделителей подстрок выбираем "равно" и пробел. (delims== ")
Рассмотрим первые 2 информационные строки (на примере двух ответов, с пингом и без):
Код:

Pinging My_Comp_Name [192.168.1.5] with 32 bytes of data:
Reply from 192.168.1.5: bytes=32 time<1ms TTL=128



Pinging 192.168.1.55 with 32 bytes of data:
Reply from 192.168.1.5: Destination host unreachable.

В первой строке нам интересна 2 и 3 подстрока, при наличии у пингуемого узла имени (например, здесь My_Comp_Name), третья подстрока содержит IP, это можно проверить в If и при совпадении с полученным в аргументе значением, записать в переменную имя узла и IP:
If /I "%%k"=="[%~1]" Set "OutString=%%j %%k"
В противном случае переменная OutString останется пустой.
Во второй строке нам интересно наличие в 7 подстроке параметра TTL, который выдаётся при наличии ответа узла.
Если TTL присутствует, делаем переменную OutTTL непустой.
If /I "%%l"=="TTL" Set "OutTTL=TTL"
Чтобы "поймать" вторую строку, смотрим первое слово, если оно Reply, то прекращаем обработку ping в FOR
If /I "%%i"=="Reply" GoTo :Continue
То есть нам для анализа строки выдачи ping понадобились 1,2,3,7 подстроки, что прописали в параметре FOR
tokens=1,2,3,7
Им соответствуют переменные цикла по алфавиту начиная с %%i: %%i %%j %%k %%l
Далее, если обе переменные непустые, записываю значение OutString в файл.
Важно: в начале батника я определил кодовую страницу
chcp 437 >nul
При этом выдача Ping ocуществляется на английском языке.


baradan2000 17-04-2017 12:19 2730070

Спасибо большое. Теперь всё понял. Тему можно закрывать.


Время: 18:07.

Время: 18:07.
© OSzone.net 2001-