Test-Connection: Ping in PowerShell senden

    Ping unter PowerShell mit Test-ConnectionPowershell verfügt mit Test-Connection über ein eigenes Cmdlet, um ICMP-Pakete an andere Rechner zu schicken und deren Erreichbarkeit zu prüfen. Im Vergleich zum herkömmlichen Ping bietet es erweiterte Möglichkeiten, etwa das gleichzeitige Ansprechen mehrerer Zielrechner.

    Grundsätzlich kann man das Windows-eigene Dienstprogramm Ping.exe auch in PowerShell aufrufen. Das wird man am ehesten bei der interaktiven Nutzung auf der Kommandozeile tun, wenn man die zusätzlichen Features von Test-Connection nicht benötigt. Dagegen empfiehlt sich in Scripts die Verwendung der PowerShell-eigenen Mittel, weil das zurückgegebene Win32_PingStatus-Objekt eine genauere Analyse der Ergebnisse erlaubt.

    Mehr Optionen für PowerShell-Pings

    Beide Implementierungen setzen die gängigen Features von Ping um und bieten etwa die Möglichkeit, die Anzahl der Echo-Anforderungen, Time to live (TTL) oder eine Zeitüberschreitung zu spezifizieren. Test-Connection sieht darüber hinaus vor, das Intervall zwischen den Pings festzulegen oder sich für die WMI-Verbindung zu authentifizieren. Schließlich hat das Cmdlet noch den Vorteil, dass die Firewall auf den Ziel-PCs nicht angepasst werden muss, um Ping-Anfragen durchzulassen.

    Ein einfacher Aufruf sieht so aus wie bei ping.exe:

    Test-Connection <Server-Name oder IP>

    Mehrere PCs als Quelle und Ziel

    Ein wesentlicher Vorzug von PowerShell besteht darin, dass man auch den Quell-Computer ändern kann und somit nicht nur Pakete vom lokalen PC, sondern von einem oder mehreren anderen Windows-Rechnern aus verschicken kann. In diesem Fall gibt man den PC oder die PCs, von wo die Ping-Anforderungen gesendet werden sollen, über den Parameter -Source an. Möchte man mehrere IP-Geräte gleichzeitig anpingen, dann übergibt man dem Parameter -ComputerName eine Komma-separierte Liste von IP-Adressen oder Hostnamen:

    Test-Connection -Source Client-1,Client-2 -ComputerName Server-1,Server-2

    In diesem Beispiel senden Client-1 und Client-2 Pings an Server-1 und Server-2.

    Ping-Zeiten prüfen

    Wenn man in einem Script die Ping-Zeiten mehrerer Rechner prüfen und bei Überschreiten eines kritischen Wertes (im folgenden Beispiel 3ms) bestimmte Anweisungen ausführen möchte, dann könnte man dies nach diesem Muster tun:

    $ping = Test-Connection -source Client-1 -ComputerName Server-1,Server-2

    foreach($p in $ping){
     if($p.ResponseTime -gt 3){$p.Address + ": " + $p.ResponseTime +"ms"}
    }

    Parameter -Quiet

    Eine einfachere Variante eines Ping, bei der man nur wissen will, ob irgendwelche Fehler aufgetreten sind, verwendet den Parameter -Quiet. In diesem Fall muss man auf den Parameter -Source verzichten und die Anforderungen vom lokalen Rechner verschicken:

    if (-not (Test-Connection -ComputerName Server-1 -Quiet)){
     Write-Host "Host nicht erreichbar!"
    }

    Trickreicher wird es im Fall eines Multi-Ping, weil die if-Bedingung dann immer richtig ist, wenn auch nur einer der Hosts erreichbar ist. Daher muss man über alle Rückgabewerte iterieren:

    $ping = Test-Connection -ComputerName Server-1,Server-2 -Quiet

    foreach($p in $ping){
     if($p -eq $false){Write-Host "Host nicht ereichbar!"}
    }

    Dieses Beispiel gibt die Meldung "Host nicht erreichbar aus!", sobald dies auf einen der Rechner zutrifft. Den betreffenden PC muss man dann separat ermitteln.

    Zum Schalter -Quiet wäre noch zu erwähnen, dass man damit $false auch dann erhält, wenn der Host-Name nicht aufgelöst werden kann. Dagegen gibt der normale Aufruf von Test-Connection in dieser Situation eine Fehlermeldung aus und ignoriert den betreffenden Rechner im zurückgegebenen Win32_PingStatus-Objekt.

    3 Kommentare

    Bild von Enrico S.
    Enrico S. sagt:
    11. Juni 2014 - 13:12

    Test-Connection -Source Client-1,Client-2 -ComputerName Server-1,Server-2

    Mehrere Ziele zu definieren die dann tatsächlich abwechselnd gepingt werden, funktioniert bei mir.
    Aber mehrere Sources scheint nicht machbar.
    Ich bekomme immer nur als Source die erste Quelle in der Liste angezeigt und gepingt.

    Mache ich einen Fehler? Oder ist n:n doch nicht möglich. :)

    Bild von Marco Krage
    Marco Krage sagt:
    21. August 2014 - 11:34

    Es werden bei mir immer 4 Pings von jeder Source durchgeführt.

    Source-1
    Source-1
    Source-1
    Source-1
    Source-2
    Source-2
    Source-2
    Source-2
    Source-3
    ...

    Bild von adrian
    adrian sagt:
    27. Februar 2017 - 16:10

    hallo, gibt es die Möglichkeit bei Test-Netconnection einen -T parameter zusetzen wie bei cmd.exe? viele grüsse, adrian