IT

CMD/PowerShell: Ping-Ergebnis mit Errorlevel auswerten

Auch jeder Hobby-Computerbastler dürfte den Ping-Befehl kennen, mit dem man prüfen kann ob ein Computer bzw. Netzwerkgerät erreichbar ist. Schließlich ist dies der erste naheliegende Test wenn irgendetwas im Netzwerk nicht funktioniert. Zumindest um herauszufinden ob das Gerät überhaupt richtig im Netzwerk eingebunden ist. Mit Hilfe des Befehls kann man aber in Skripten durchaus komplexere Dinge bewerkstelligen, wenn man die Prüfung in einer if-Abfrage verwendet.

Problem beim Pingbefehl

Jeder sollte die Ausgabe kennen, die ein Ping-Befehl ausgibt. Diese sieht im Erfolgsfall beispielsweise so aus:

Leider hat man nicht die Möglichkeit generell zu ermitteln ob der Ping-Befehl erfolgreich war oder nicht. Zwar kann man den Ping-Befehl im Nachgang durch den zurückgegebenen Errorlevel prüfen, erhält aber unbrauchbare Ergebnisse. Im oberen Fall gibt die Errorlevel-Abfrage „if %errorlevel%==0“ als Ergebis true zurück.

Im Fall einer Zeitüberschreitung kommen keine Pakete zurück:

In diesem Fall bekommt man ein negatives Ergebnis im Errorlevel (das Ergebnis der Abfrage „if %errorlevel%==0“ ist false).

Manchmal gibt es aber auch die Meldung „Zielhost nicht erreichbar“, aber es kommen Pakete zurück:

In diesem Fall ergibt die Errorlevel-Abfrage „if %errorlevel%==0“ leider ebenfalls ein positives Ergebnis wie im ersten Beispiel, da ja Pakete zurückgekommen sind.

Somit kann man diesen Weg vergessen und muss sich einen anderen suchen um ein zuverlässiges Ergebnis zu erhalten.

 

Lösung per CMD für die Ping-Auswertung

Die Lösung ist es stattdessen den Ergebnistext der Ping-Abfrage auszuwerten. Hier sucht man nach einem Textbestandteil der nur bei erfolgreichem Pingen im Text enthalten ist. Dies kann mit Hilfe des Befehls „find“ erledigt werden, an den man die Ausgabe des ping-Kommandos übergibt. Auf das find-Ergebnis kann man dann wiederum die Abfrage des Errorlevels anwenden:

 

Im Prinzip könnte man auch nach „Ca. Zeitangaben“, „Minimum“, „Maximum“ oder „Mittelwert“ suchen und würde auf das gleiche Ergebnis kommen. Denn diese Phrasen bzw. Begriffe kommen bei einem Fehler auch nicht im Ausgabetext vor:

 

Von den deutschen Begriffen sollte man aber bei der Suche möglichst Abstand nehmen, sofern es möglich ist. Ansonsten würde das Skript auf einem englischsprachigen System nicht funktionieren. Um auch keine Probleme auf einem Computer zu bekommen der blöderweise so benannt wurde, dass ein „TTL“ im Computernamen vorkommt, sollte man am besten auch das „=“ noch in den Suchbegriff mit aufnehmen. (Danke an den Hinweis in den Kommentaren)

 

Lösung per PowerShell für die Ping-Auswertung

Eine „coolere“ Lösung gibt es natürlich per PowerShell. Hier gibt es die Funktion Test-Connection die man mittels Parameter direkt auf das Ergebnis einschränken kann:

 

Wofür kann man das brauchen?

Die Auswertung der Abfrage ist praktisch um etwas nur in dem Fall auszuführen wenn ein anderer Computer erreichbar ist. Dies könnte z. B. das Kopieren von Dateien sein wenn dieser erreichbar ist. In dem Fall wenn er nicht erreichbar ist und man sich das wegloggt hat man auch sofort den Grund.

Ganz praktisch ist dies auch wenn man eine ganze Reihe an Computern hat, die nur per VPN erreichbar sind. Dies könnten z. B. 200 Computerkassen verstreut in eine ganze Menge Filialen sein. Grundsätzlich ist hier natürlich eine Inventarisierungs- und Monitoringlösung  auf lange Sicht eher zu empfehlen. Aber am Anfang, gerade auch wenn man einen Haufen Schrott aufräumen muss, ist so ein Skript erst einmal sehr praktisch.

Als erstes ist es morgens interessant zu wissen ob irgendwelche Geräte, die nicht in unmittelbarer Nähe stehen, abgeraucht sind. Hierzu wäre z. B. ein Skript hilfreich das alle zu prüfenden IPs in einer Schleife durchgeht und einem nur die nicht erreichten Geräte wegloggt oder per E-Mail schickt. Das geht mit der PowerShell auch recht einfach.

 

Fazit zur Ping-Auswertung in CMD und PowerShell

Hier zeigt sich, dass die PowerShell mächtiger und komfortabler ist, da man ohne die Nutzung der bekannten Umwege ans Ziel kommt. Auf alten Systemen ist die Batch-Variante aber natürlich nicht wegzudenken. Wer sich aber auf einem aktuellen Windows 10 oder Server 2019 befindet ist wahrscheinlich mit der PowerShell-Variante besser bedient, auch wenn die PowerShell gefühlt manchmal etwas langsamer ist.

 

Weitere interessante Artikel zur Windows Powershell:

Screenshots mit PowerShell automatisch unter Windows speichern
Welche PowerShell-Version habe ich? – PowerShell-Version anzeigen
Was ist PowerShellCore? Windows PowerShell unter Linux und MacOS?
Powershell und CMD: Clear um Konsole zu leeren?
Powershell: Sudo-Befehl wie unter Linux nutzen für Administratorrechte?
COM-Port eines Geräts ändern per Powershell
CMD/Powershell: Ping-Ergebnis mit Errorlevel auswerten
Powershell: Netzwerkadapter-Konfiguration ändern (IP-Adresse, Gateway, DNS, DHCP)
Powershell-Skript als Benutzer-Anmeldeskript in einer Domäne nutzen?
Powershell: Fenster nach Skriptausführung nicht automatisch schließen
Powershell: UTF8-Problem beim Export
XML-Bearbeitung mit Powershell
Replace und Escaping in Powershell
MessageBox mit Powershell auf anderen Computern anzeigen
While- und Until-Schleifen in PowerShell und Batch
Einfaches inkrementelles Backup mit Powershell
Einfache Außer-Haus-Sicherung mit Powershell
Schnittstelle von XML zu MS-SQL mit Powershell realisieren
Powershell: Automatische Anwendungssteuerung
Macht die ExecutionPolicy für Powershell-Skripte Sinn?
Wiederkehrende E-Mail-Abwesenheitsnotiz für Outlook mit Powershell
HyperV-Netzwerkadapter per Powershell umbenennen und entfernen
Powershell: DELL Service Tags auslesen
Powershell-Backup-Skript für den Thunderbird-Profilordner
Download-Skript in Powershell
Einfache Powershell-Skripte
Java-Anwendungen über CMD oder Powershell starten
Pfad im Explorer schneller kopieren – auch als vollständigen UNC-Pfad
Windows 11: Startmenü anpassen, klassische Taskleiste, links ausrichten
Wie lange läuft mein PC schon? – PC Laufzeit auslesen unter Windows 10
Windows 10: Standorttyp des Netzwerks ändern
Windows Server 2016: WSUS startet nicht vernünftig
 
Tobias Langner

Tobias Langner

Ich arbeite seit mehreren Jahren als Software-Release-Manager, zuvor als IT-Administrator, bin ausgebildeter Fachinformatiker für Systemintegration und Studium-"Pausierer" an der FernUni Hagen. Achtung: Für die Richtigkeit der zur Verfügung gestellten Informationen, Skripte, etc. übernehme ich keine Gewähr. Deren Nutzung geschieht ausdrücklich auf eigene Gefahr!

Alle Beiträge ansehen von Tobias Langner →

2 Gedanken zu “CMD/PowerShell: Ping-Ergebnis mit Errorlevel auswerten

  1. Danke! Ich habe mir angewöhnt, nach Zeichenketten zu suchen, die auch bei englischen Systemen funktionieren. Da ist TTL schon gut. Aber ich würde noch das „=“, also „TTL=“ dazunehmen, damit auch bei einem Computer namens „BLATTLAUB123“ kein falsches Ergebnis kommt 😉

    1. Hallo Bernhard,

      vielen Dank für die Rückmeldung. Stimmt, mit dem englischen Begriff hast du natürlich recht und es ist sicherer nach einem Begriff zu suchen der bei englischsprachigen Systemen gleich ist und möglichst auch nicht im Computernamen vorkommt. Ich werde das mal noch ergänzen 😉

      Viele Grüße
      Tobias

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert