-
Notifications
You must be signed in to change notification settings - Fork 2
PowerShell ile birden fazla IP'ye ping atmak (tr TR)
Emre Ozan Memis edited this page Oct 15, 2020
·
1 revision
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
powershell
Get-Content .\iplist.txt | .\ping.ps1
Çıktı ekranı aşağıdaki gibidir.
PowerShell
powershell
__________________________________________________________............................................................................................ | ( 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
powershell
[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 }