Как извлечь IP-адрес IPv4 из выходных данных ipconfig

19506
Samuel Pauk

Я пытаюсь, чтобы cmd копировал только определенный набор символов из вывода команды. Я был в состоянии выбрать строку, в которой существует фраза, но оттуда я потерян. Вот моя команда до сих пор.

ipconfig | findstr /i "ipv4" 

Я уверен, что вы знакомы с ipconfigкомандой и findstrкомандой. В основном я изолирую IPv4-адрес конкретного компьютера. Это то, что приведенная выше команда.

IPv4 Address. . . . . . . . . . . : 192.168.1.75 

Я хотел бы выделить "192.168.1." и сохранить его в переменной, которая будет использоваться гораздо позже в команде. Скажите, что я установил «192.168.1». к переменной a.

Следующая команда, которую я хочу запустить, сканирует все IP-адреса с 192.168.1.1 по 192.168.1.254 и сохраняет то, что используется. Так как это, скоро будет программа, будет запускаться на разных компьютерах в разных местах «192.168.1». будет другим, и я хочу изолировать все, что cmd помещает в его местоположение. Таким образом, вышеупомянутая переменная может быть, но не ограничиваясь этим, 192.168.10., 10.10.10., Или даже 1.1.1. в зависимости от ситуации. Вот код, который я буду использовать.

FOR /L %i IN (1,1,254) DO ping -n 1 (the 'a' variable)%i | FIND /i "bytes=">>c:\ipaddresses.txt 

или если помогает понять, как будет выглядеть переменная.

FOR /L %i IN (1,1,254) DO ping -n 1 192.168.1.%i | FIND /i "bytes=">>c:\ipaddresses.txt 

Я использую 64-битную Windows 10 Pro Machine.

2
Если мне нужно экспортировать вывод `ipconfig | findstr / i "ipv4" `в текстовый файл, который вполне приемлем. Samuel Pauk 8 лет назад 0
Я не пользователь Windows, но вы можете использовать «sed», «perl» или любой другой процессор регулярных выражений, чтобы изолировать эти символы с помощью регулярного выражения. Регулярное выражение будет выглядеть примерно так: ^. * (\ D \. \ D \. \ D \.) \ D . * $ И тогда вы сохраняете только первую группу захвата (в скобках, например, с \ 1 в sed). retrography 8 лет назад 0
@retrography Windows не имеет встроенных `sed`,` perl` и т. д. Проблема ОП может быть решена с помощью встроенных команд (см. Мой ответ) DavidPostill 8 лет назад 1

2 ответа на вопрос

3
DavidPostill

Я хотел бы выделить "192.168.1." и сохранить это в переменную

Используйте следующий пакетный файл (test.cmd):

@echo off setlocal setlocal enabledelayedexpansion rem throw away everything except the IPv4 address line  for /f "usebackq tokens=*" %%a in (`ipconfig ^| findstr /i "ipv4"`) do ( rem we have for example "IPv4 Address. . . . . . . . . . . : 192.168.42.78" rem split on : and get 2nd token for /f delims^=^:^ tokens^=2 %%b in ('echo %%a') do ( rem we have " 192.168.42.78" rem split on . and get 4 tokens (octets) for /f "tokens=1-4 delims=." %%c in ("%%b") do ( set _o1=%%c set _o2=%%d set _o3=%%e set _o4=%%f rem strip leading space from first octet set _3octet=!_o1:~1!.!_o2!.!_o3!. echo !_3octet! ) ) ) rem add additional commands here endlocal 

Заметки:

  • Значение, которое вы хотите сохранить в _3octet
  • Удалить echoчто есть для отладки
  • Замените rem add additional commands hereна ваш "сетевой пинг"

Пример использования и вывод:

F:\test>ipconfig | findstr /i "ipv4" IPv4 Address. . . . . . . . . . . : 192.168.42.78  F:\test>test 192.168.42. 

Дальнейшее чтение

  • Индекс AZ командной строки Windows CMD - Отличный справочник по всем вопросам, связанным с командной строкой Windows.
  • enabledelayedexpansion - отложенное расширение приведет к тому, что переменные будут расширяться во время выполнения, а не во время анализа.
  • for / f - Циклическая команда против результатов другой команды.
  • ipconfig - настройка IP (настройка интернет-протокола)
  • set - отображать, устанавливать или удалять переменные окружения CMD. Изменения, сделанные с помощью SET, будут сохраняться только в течение текущего сеанса CMD.
  • setlocal - устанавливает параметры для контроля видимости переменных среды в командном файле.
  • переменные - извлечение части переменной (подстроки).
Большое спасибо, Дэвид! Я проверил код, и он вышел именно с тем, что я хотел. Моя единственная проблема в том, что я не могу использовать переменную `! _3octet!`. Пожалуйста, извините за мое невежество, если я делаю что-то не так. Вот первый случай, когда я буду использовать эту переменную. `cd C: \ Windows для / l% i IN (1,1254) выполнить команду ping -n 1! _3octet!% i` Вместо того, чтобы подключить переменную, команда выполняет команду ping для"! _3octet!% i "с`% я каждый номер 1-254 Samuel Pauk 8 лет назад 0
@SamuelPauk как указано, замените `rem add дополнительные команды здесь` в командном файле на` for / l %% i в (1,1254) do ping -n 1! _3octet! %% i` DavidPostill 8 лет назад 0
0
SoapBox

Попробуйте что-то вроде этого. «ipconfig / all> network_info.txt» просто создает текстовый файл для программы

ipconfig /all > network_info.txt type network_info.txt | findstr /v Stuff | findstr /v Etc > whatyouwant.txt set /p Build=<whatyouwant.txt 

Этот вариант трудоемкий, но невероятно простой. Вы должны продолжать делать

| findstr /v something 

и заменить слово на то, что вы хотите. Вы должны решить, как вы хотите удалить определенные слова из разных строк, но это будет работать, если вы хотите простой. Я использую это в выходных данных для команд, чтобы удалить мусор, который я не хочу. В идеале вы должны поместить выход в текст, и он будет читать первую строку, чтобы у вас была только одна строка текста. Надеюсь, я помог или помог кому-либо, кто нуждался в этом ответе. Это запутанно, но вы получите ответ в текстовом виде, если это плюс

Похожие вопросы