PowerShell ile aynı anda çok sayıda IP'ye ping atmak (tr-TR)

Steel Contributor

Toplu sunucu güncellemeleri yada bakımlarında suncunun up mı down mu kontrol etmek için hemen hemen herkesin ilk yaptığı işlemlerden olan "ping" atma süreci için gün geliyor aynı anda birden fazla ipye ping atmamız gerekiyor bunun için bir çok komut satırı açmak yerine basit bir script ile oluşturduğunuz ip listesini kullanarak toplu bir şekilde iplere ping atabilirsiniz.

 

 

[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)' -f $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
}

 

Scriptinizi PS1 dosyası olarak oluşturun ve PowerShell komut satırından Get-Content ile ip listenizi ve PS1 dosyanızı çalıştırınız.

Get-Content .\iplist.txt | .\ping.ps1

 

 Uygulama çıktısı aşağıdaki gibidir.

__________________________________________________________............................................................................................ | (   0ms) | 192.18.101.130
______________________________________________________________________________________________________________________________________________________ | (----ms) | 192.18.101.126
__________________________________________________________............................................................................................ | (   0ms) | 192.18.101.135
PS C:\Users\Administrator\desktop> 
PS C:\Users\Administrator\desktop> Get-Content .\iplist.txt | .\ping.ps1

 

0 Replies