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

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

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:

 

Lösung per Powershell

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 Monitoringslö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

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.

 

Schreibe einen Kommentar