Como eu extraio o endereço IP de um comando ping bem-sucedido?

2

Com muita ajuda de outro usuário, consegui cortar caracteres de uma única saída do CMD. Em seguida, adicionei minha próxima parte do código de onde ele me deixou com a variável _3octet . Meu código está varrendo todos os endereços IP associados ao gateway ao qual o computador está conectado e apenas os que têm uma resposta. De lá eu recebo uma lista de IPs que responderam.

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

De lá, eu quero pegar apenas os endereços IP, então corte tudo, exceto "192.168.1. #", para ser usado em uma parte futura do programa. Semelhante à parte inicial do código com a variável _3octet . Aqui está o meu código.

@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

Estou recebendo : was unexpected at this time. como uma saída várias vezes. O que me diz que está tentando pingar todos os endereços 1-254 e não aqueles que surgem como resposta. Escusado será dizer que o meu código não está funcionando como eu esperava.

Eu estava planejando usar essa lista final de endereços IP neste código: shutdown -r -m \192.168.1.1 -t 10 para desligar os computadores conectados ao gateway.

Se isso for confuso, me avise. Obrigado.

    
por Samuel Pauk 04.02.2016 / 00:41

1 resposta

2

Eu quero pegar apenas os endereços IP dos pings de sucesso

Eu não vou tentar consertar a segunda parte do seu arquivo de lote, é mais fácil escrever do zero.

Use o seguinte arquivo de lote (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

Notas:

  • O valor que você deseja é salvo em !_3octet!!_4octet! , onde

    • ! _ 3octet! é o mesmo que antes

    • ! _ 4octet! é o último octeto (você não precisa de dois extrair os primeiros 3 octetos duas vezes!)

  • Você não precisa de cd C:\Windows

  • Um dos endereços IP será seu endereço de gateway (roteador), você provavelmente não quer tentar executar shutdown no gateway!

Leitura Adicional

  • Um índice A-Z da linha de comando do Windows CMD - Uma excelente referência para todas as coisas relacionadas à linha do Windows cmd.
  • enabledelayedexpansion - Expansão com atraso fará com que as variáveis sejam expandidas em tempo de execução e não no tempo de análise.
  • para / f - Comando Loop contra os resultados de outro comando.
  • ipconfig - Configurar IP (configuração do protocolo da Internet)
  • definir - Exibir, definir ou remover variáveis de ambiente do CMD. As alterações feitas com o SET permanecerão apenas pela duração da sessão atual do CMD.
  • setlocal - Defina opções para controlar a visibilidade de variáveis de ambiente em um arquivo em lotes.
  • variáveis - Extrai parte de uma variável (substring).
por 04.02.2016 / 01:51