2

С большой помощью другого пользователя я смог вырезать символы из одного вывода из CMD. Затем я добавил свою следующую часть кода, откуда он меня оставил, с переменной _3octet . Мой код сканирует все IP-адреса, связанные со шлюзом, к которому подключен компьютер, и фиксирует только те, которые имеют ответ. Оттуда я получаю список IP-адресов, которые ответили.

Reply from 192.168.1.67: bytes=32 time=288ms TTL=64

Reply from 192.168.1.72: bytes=32 time<1ms TTL=128

Reply from 192.168.1.73: bytes=32 time=16ms TTL=64

Reply from 192.168.1.75: bytes=32 time<1ms TTL=128

Reply from 192.168.1.76: bytes=32 time=155ms TTL=64

Reply from 192.168.1.88: bytes=32 time=1ms TTL=255

Оттуда я хочу получить только IP-адреса, поэтому исключаю все, кроме «192.168.1. #», Для использования в будущей части программы. Аналогично начальной части кода с переменной _3octet . Вот мой код

@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!
        )
    )
)
cd C:\Windows
for /l %%i IN (1,1,254) do ping -n 1 !_3octet!%%i | for /f delims^=^:^ tokens^=1 %%g in (find /i "bytes=32") do (
for /f "tokens=1-4 delims=." %%j in ("%%g") do (
    set _o1=%%j
    set _o2=%%k
    set _o3=%%l
    set _o4=%%m
    set _4octet=!_o1:~11!.!_o2!.!_o3!.!_o4!
    echo !_4octet!
    )
)
endlocal

Я получаю : was unexpected at this time. в качестве выхода несколько раз. Что говорит мне, что он пытается пинговать каждый адрес 1-254, а не те, которые приходят в ответ. Излишне говорить, что мой код не работает, как я надеялся.

Я планировал использовать этот окончательный список IP-адресов в этом коде: shutdown -r -m \\192.168.1.1 -t 10 для выключения компьютеров, подключенных к шлюзу.

Если это вообще сбивает с толку, дайте мне знать. Спасибо.

1 ответ1

2

Я хочу получить только IP-адреса из успешных пингов

Я не собираюсь пытаться исправить 2-ю часть вашего командного файла, проще написать его с нуля.

Используйте следующий пакетный файл (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!
        )
    )
)
for /l %%i in (1,1,254) do (
  rem do the ping and grab the 3rd token (ip address) if it succeeds (TTL= is found)
  for /f "usebackq tokens=3" %%j in (`ping -n 1 !_3octet!%%i ^| find "TTL="`) do (
      rem we have ip address with a trailing :
      rem split on . and get the 4th token (last octet)
      rem we don't need the first 3 as they are already in !_3octet!
      for /f "tokens=4 delims=." %%k in ("%%j") do (
        set _o4=%%k
        rem strip trailing : from last octet
        set _4octet=!_o4:~0,-1!
        echo !_4octet!
      )
    )
  )
endlocal

Заметки:

  • Значение, которое вы хотите сохранить в !_3octet!!_4octet! где

    • !_3octet! такой же как и раньше

    • !_4octet! последний октет (вам не нужно два извлекать первые 3 октета дважды!)

  • Вам не нужен cd C:\Windows

  • Один из IP-адресов будет адресом вашего шлюза (маршрутизатора), вы, вероятно, не хотите пытаться выполнить shutdown на шлюзе!


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

  • Индекс AZ командной строки Windows CMD - Отличный справочник по всем вопросам, связанным с командной строкой Windows.
  • enabledelayedexpansion - отложенное расширение приведет к тому, что переменные будут расширяться во время выполнения, а не во время анализа.
  • for /f - Циклическая команда против результатов другой команды.
  • ipconfig - настройка IP (настройка интернет-протокола)
  • set - отображать, устанавливать или удалять переменные окружения CMD. Изменения, сделанные с помощью SET, будут сохраняться только в течение текущего сеанса CMD.
  • setlocal - устанавливает параметры для контроля видимости переменных среды в командном файле.
  • переменные - извлечение части переменной (подстроки).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .