Hepimizin sistem kurulumlarında operasyon süreçlerinde özelikle migration süreçlerinde ihtiyacı olan toplu ping ile sistemleri takip etme isteğiniz olmuştur. Bu script ile toplu ping atarak sistemlerinizi tek bir PowerShell ekranından takip edebilirsiniz.

 

Yapmanız gerekenler çok basit önce ping atmak istediğiniz IPleri yada FQDN adreslerini bir txt dosyası yaparak alt alta yazınız.

İkinici olarak aşağıda scriptini paylaştığım TopluPing.ps1 dosyası ile hazırladığınız txt dosyasını aynı dizin üzerinde bulundurunuz

Son olarak aşağıdaki komut ile süreçi başlatınız.

 

 

PowerShell
Düzenle|Kaldır
Get-Content .\iplist.txt | .\ping.ps1
 Çıktı ekranı aşağıdaki gibidir.
PowerShell
Düzenle|Kaldır
__________________________________________________________............................................................................................ | (   0ms) | 192.18.1.230 
______________________________________________________________________________________________________________________________________________________ | (----ms) | 192.18.1.226 
__________________________________________________________............................................................................................ | (   0ms) | 192.18.1.235 
PS C:\Users\Administrator\desktop>  
PS C:\Users\Administrator\desktop> Get-Content .\iplist.txt | .\ping.ps1
 
TopluPing.ps1 içeriği
PowerShell
Düzenle|Kaldır
[CmdletBinding()] 
Param 
( 
    [Parameter(Mandatory=$true,  
                ValueFromPipeline=$true, 
                ValueFromPipelineByPropertyName=$true,  
                Position=0)] 
    [ValidateNotNullOrEmpty()] 
    [string[]]$ComputerName, 
 
 
    [Parameter(Position=1)] 
    [int]$ResultCount = 150 
) 
 
    $PipelineItems = @($input) 
    if ($PipelineItems.Count) 
    { 
        $ComputerName = $PipelineItems 
    } 
 
$ComputerName |  
    Where-Object   { -not ($_ -as [ipaddress]) } | 
    ForEach-Object { 
        $null = Resolve-DnsName $_ -ErrorAction Stop 
    } 
 
$UseClearHostWhenRedrawing = $false 
try { 
    [System.Console]::SetCursorPosition(0, 0) 
} catch [System.IO.IOException] { 
    $UseClearHostWhenRedrawing = $true 
} 
 
Clear-Host 
 
[array]$PingData = foreach($Computer in $ComputerName) 
{ 
    @{ 
        'Name'       = $Computer 
        'Pinger'     = New-Object -TypeName System.Net.NetworkInformation.Ping 
        'Results'    = New-Object -TypeName System.Collections.Queue($ResultCount) 
        'LastResult' = @{} 
    } 
} 
foreach ($Item in $PingData) 
{ 
    for ($Filler = 0; $Filler -lt $ResultCount$Filler++) 
    { 
        $Item.Results.Enqueue('_') 
    } 
} 
 
while ($true) 
{ 
 
        [array]$PingTasks = foreach($Item in $PingData) 
        { 
            $Item.Pinger.SendPingAsync($Item.Name) 
 
        } 
 
        try { 
            [Threading.Tasks.Task]::WaitAll($PingTasks) 
        } catch [AggregateException] { 
        } 
 
        0..($PingTasks.Count-1) | ForEach-Object { 
                 
            $Task         = $PingTasks[$_] 
            $ComputerData = $PingData[$_] 
 
            if ($Task.Status -ne 'RanToCompletion') 
            { 
                $ComputerData.Results.Enqueue('?') 
            } 
            else 
            { 
                $ComputerData.LastResult = $Task.Result 
                     
                switch ($Task.Result.Status) 
                { 
                    'Success'  { $ComputerData.Results.Enqueue('.') } 
                    'TimedOut' { $ComputerData.Results.Enqueue('x') } 
                } 
                     
            }   
        } 
 
        foreach ($Item in $PingData) 
        { 
            while ($Item.Results.Count -gt $ResultCount) 
            { 
                $null = $Item.Results.DeQueue() 
            } 
        } 
 
 
        if ($UseClearHostWhenRedrawing) 
        { 
            Clear-Host 
        } 
        else 
        { 
            $CursorPosition = $Host.UI.RawUI.CursorPosition 
            $CursorPosition.X = 0 
            $CursorPosition.Y = 0 
            $Host.UI.RawUI.CursorPosition = $CursorPosition 
        } 
 
        foreach ($Item in $PingData) 
        { 
            Write-Host (($Item.Results -join ''+ ' | '-NoNewline 
 
            $PingText = if ($Item.LastResult.Status -eq 'Success') 
            { 
                if (1000 -le $Item.LastResult.RoundTripTime) 
                { 
                     '(999+ms)' 
                } 
                else 
                { 
                    '({0}ms)' -$Item.LastResult.RoundTripTime.ToString().PadLeft(4, ' ') 
                } 
            } 
            else 
            { 
                '(----ms)' 
            } 
            Write-Host "$PingText | " -NoNewline 
            if ($Item.LastResult.Status -eq 'Success') 
            { 
                Write-Host ($Item.Name) -BackgroundColor DarkGreen 
            } 
            else 
            { 
                Write-Host ($Item.Name) -BackgroundColor DarkRed 
            } 
        } 
        $Delay = 1000 - ($PingData.lastresult.roundtriptime | Sort-Object | Select-Object -Last 1) 
        Start-Sleep -MilliSeconds $Delay 
}