Wie extrahiere ich die IP-Adresse aus einem erfolgreichen Ping-Befehl?

1041
Samuel Pauk

Mit viel Hilfe eines anderen Benutzers konnte ich aus einer einzigen Ausgabe von CMD Zeichen ausschneiden. Ich fügte dann meinen nächsten Teil des Codes hinzu, von dem er mich mit Variable verlassen hat _3octet. Mein Code scannt alle IP-Adressen, die mit dem Gateway verbunden sind, mit dem der Computer verbunden ist, und erfasst nur die, die eine Antwort haben. Von dort bekomme ich eine Liste von IPs, die geantwortet haben.

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 

Von dort möchte ich nur die IP-Adressen übernehmen, also alles außer "192.168.1. #" Wegschneiden, um in einem zukünftigen Teil des Programms verwendet zu werden. Ähnlich wie der Anfangsteil des Codes mit der _3octetVariablen. Hier ist mein Code.

@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 

Ich bekomme : was unexpected at this time.mehrmals eine Ausgabe. Was sagt mir, dass es versucht, jede Adresse 1-254 zu pingen und nicht die, die als Antwort auftauchen. Ich brauche nicht zu sagen, dass mein Code nicht so funktioniert, wie ich gehofft hatte.

Ich hatte vor, die letzte Liste der IP-Adressen in diesem Code zu verwenden: shutdown -r -m \\192.168.1.1 -t 10um die mit dem Gateway verbundenen Computer herunterzufahren.

Wenn das überhaupt verwirrend ist, lass es mich wissen. Vielen Dank.

2
`für / l %% i in (1,1,254) Ping -n 1! _3octet! %% i do (für / f" delims =: tokens = 1 "%% g in (find / i" bytes = 32 " ) `Das erscheint als" Bad parameter do. " Samuel Pauk vor 8 Jahren 0

1 Antwort auf die Frage

2
DavidPostill

Ich möchte nur die IP-Adressen aus den erfolgreichen Pings holen

Ich werde nicht versuchen, den zweiten Teil Ihrer Batchdatei zu reparieren, es ist einfacher, sie von Grund auf zu schreiben.

Verwenden Sie die folgende Batchdatei (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 

Anmerkungen:

  • Der gewünschte Wert wird in !_3octet!!_4octet!wo gespeichert

    • ! _3octet! ist wie zuvor

    • ! _4octet! ist das letzte Oktett (Sie müssen die ersten 3 Oktetts nicht zweimal extrahieren!)

  • Du brauchst nicht cd C:\Windows

  • Eine der IP-Adressen ist Ihre Gateway-Adresse (Router-Adresse). Sie möchten wahrscheinlich nicht versuchen, shutdowndas Gateway auszuführen.


Lesen Sie weiter

  • Ein AZ-Index der Windows-CMD-Befehlszeile - Eine hervorragende Referenz für alles, was mit Windows-Cmd-Zeilen in Verbindung steht.
  • enabledelayedexpansion - Eine verzögerte Erweiterung bewirkt, dass Variablen nicht zur Analysezeit, sondern zur Ausführungszeit erweitert werden.
  • for / f - Schleifenbefehl gegen die Ergebnisse eines anderen Befehls.
  • ipconfig - IP konfigurieren (Internet Protocol-Konfiguration)
  • set - CMD-Umgebungsvariablen anzeigen, festlegen oder entfernen. Mit SET vorgenommene Änderungen bleiben nur für die Dauer der aktuellen CMD-Sitzung erhalten.
  • setlocal - Legen Sie Optionen fest, um die Sichtbarkeit von Umgebungsvariablen in einer Batchdatei zu steuern.
  • variables - Extrahieren Sie einen Teil einer Variablen (Teilzeichenfolge).
Das macht sehr viel Sinn! Vielen Dank! Samuel Pauk vor 8 Jahren 0
@ SamuelPauk Ich gehe jetzt schlafen (es ist 1 Uhr morgens hier). Wenn es nicht so funktioniert, wie es ist (durchaus möglich, da es komplexes Parsing ist und ich kein Netzwerk zum Testen habe), lassen Sie es mich wissen, und ich werde es mir morgen ansehen. DavidPostill vor 8 Jahren 0