celiko
Goto Top

PowerShell: Funktion: Ping 1x, warte auf Ergebnis

Moin,

entweder ist es einfach zu spät und ich bin müde oder einfach dumm, weil es sich so basic anfühlt...

Ich will per PowerShell eine Funktion für eine Ping-Abfrage schreiben und nutze hierfür die bereits verfügbare Funktion "Test-Connection" mit dem Parameter -Quiet.
Mit -Quiet gibt er also nur ein $true oder $false aus.
Leider gibt es hier keinen -Wait - den ich gerne selber basteln würde aber nicht hinbekomme.

Problem:
Der Ping kann 2 Sekunden dauern, oder 10 Sekunden, vielleicht auch nur ein paar Millisekunden.
Wenn ich eine IF-Abfrage starte, ob Test_DC $true oder $false, dann skippt er direkt weiter wenn der Ping noch läuft (meist bis immer bei nicht bestehender Verbindung).

Das eigentliche Script im Allgemeinen soll also überprüfen, ob eine Verbindung zu einem Server besteht und dann etwas ausführen...

function Test_DC() {
    Test-Connection -Computername "Hostname || IPv4" -Count 1 -Quiet  
}

Hat hier einer Idee wie das umgesetzt werden kann bzw. es eine Alternative gibt?

Mit freundlichen Grüßen
Celiko

Content-ID: 4952719702

Url: https://administrator.de/contentid/4952719702

Ausgedruckt am: 21.11.2024 um 13:11 Uhr

4863114660
Lösung 4863114660 13.12.2022 aktualisiert um 23:19:58 Uhr
Goto Top
Ein Ping ist da schneller.und feiner konfigurierbar inkl. Timeout . ....
$ping = New-Object System.Net.NetworkInformation.Ping
if (($ping.Send("hostname",10000)).Status -eq 'Success') {  
    # whatever
}
https://learn.microsoft.com/de-de/dotnet/api/system.net.networkinformati ...

Gruß S.
Celiko
Celiko 13.12.2022, aktualisiert am 14.12.2022 um 10:27:19 Uhr
Goto Top
Zitat von @4863114660:

Ein Ping ist da etwas feiner konfigurierbar inkl. Timeout, TTL, usw. ....
$ping = New-Object System.Net.NetworkInformation.Ping
if (($ping.Send("hostname",10000)).Status -eq 'Success') {  
    # whatever
}
https://learn.microsoft.com/de-de/dotnet/api/system.net.networkinformati ...

Gruß S.

Danke dir, super Ansatz, merke ich mir für die Zukunft wenn ich auf solche Sachen stoße face-smile

Für die, die es interessiert:
function Test_DC($Test_DC_IP) {
    $ping = New-Object System.Net.NetworkInformation.Ping
    #TRY: Falls der Ping Befehl selber ein Problem hat soll er automatisch auf '$false' setzen. 
    try {
        if ( ($ping.Send("$Test_DC_IP",10000)).Status -eq 'Success') {  
            return $true
        }
        else {
            Write-Host "Ping nicht erfolgreich" -ForegroundColor Red  
            return $false
        }
    }
    catch {
        Write-Host "ERROR: Ping lief auf einen Fehler. Breche ab." -ForegroundColor Red  
        return $false
    }
    Finally {
        $ping.Dispose()
    }
}

Somit kann die Funktion auch direkt in eine IF-Abfrage gepackt werden und eine IPv4-Adresse oder Hostnamen mitgegeben werden.

VG
4863114660
Lösung 4863114660 13.12.2022 aktualisiert um 23:41:21 Uhr
Goto Top
Dann aber bitte hinterher auch noch das Ping Object disposen, denn die Dinger reagieren gerne mal mit falschem Ergebnis wenn man zu viele von ihnen hintereinander erzeugt und nicht wieder frei gibt.
$ping.Dispose()
Und Exceptions mit try catch abfangen nicht vergessen.
Celiko
Celiko 14.12.2022 aktualisiert um 02:09:56 Uhr
Goto Top
Yap, die Ping Objects haben bei mir Probleme verursacht - danke für den Tipp und der Nennung der Methode.
Habe die Try-Catch relativ simpel gebaut... sollte so reichen für meine Zwecke.

Habe den Codeausschnitt aus meinem vorherigen Post aktualisiert.

Danke, warst eine super Hilfe face-smile
4863114660
Lösung 4863114660 14.12.2022 aktualisiert um 07:40:31 Uhr
Goto Top
Das Dispose() brauchst du nur einmal im Finally-Block schreiben, dann sparst du dir 3 mal das gleiche 😉.

Gruß S.
Celiko
Celiko 14.12.2022 aktualisiert um 10:26:48 Uhr
Goto Top
Stimmt...
Hatte die Verteilung noch um 3 Uhr verteilt - ich belasse es auf dem Server wie es ist und füge den Finally-Block lokal bei mir hinzu.

Nochmal in meinem Kommentar oben editiert mit Finally-Block.

Warst ehrlich eine große Hilfe, danke nochmal 👍

VG C.