19.03.2025

Timeout özelliği olan bir powershell ping fonksiyonu

Powershell'de Test-Connection cmlet'i ping yerine kullanılabilir. Ping'e benzer şekilde 4 adet ICMP paketi gönderir ve cevabını bekler. Bazen betiklerin içinde hedef cihazın canlı olup olmadığını anlamak için

Test-Connection -Computername hedef -Quiet -Count 1

gibi bir komut kullanırım, sadece True veya False dönen. Hedef cihaz açıksa ve ping'e cevap veriyorsa hemen True döner. Ama hedef cihaz kapalıysa False dönmesi uzun sürer. Powershell 5.1'de Test-Connection'ın bir timeout parametresi de yok. Onun için şöyle bir fonksiyon işimi görüyor:

function Test-ICMP {
    param (
        [string]$Computername = "8.8.8.8",
        [int]$Timeout = 1000  # Milisaniye
    )

    $ping = New-Object System.Net.NetworkInformation.Ping
    $task = $ping.SendPingAsync($Computername, $Timeout)

    $completed = [System.Threading.Tasks.Task]::WaitAny(@($task), $Timeout)

    if ($completed -eq 0) {
        # Ping işlemi tamamlandı, sonucu al
        $reply = $task.Result
        if ($reply.Status -eq "Success") {
            $True
        } else {
            $False
        }
    } else {
        # Timeout süresinden uzun sürdü
        $False
    }
}

Hiç bir parametre kullanmazsam varsayılan hedef olarak Google'ın birincil DNS sunucusu 8.8.8.8'e 1 adet ICMP request paketi gönderir ve 1000 ms bekler. Ama yerel ağdaki bir makinenin açık mı kapalı mı olduğunu anlamak için

Test-Connection -Computername hedef -Timeout 100

yazabilirim. 100 ms içinde açıksa True, kapalı (veya cevap dönmüyorsa) False cevabını alırım.

Hiç yorum yok: