$computers = @('www.google.com', 'www.naver.com', 'www.google.com', 'www.google.com', '1.1.1.1', '1.1.1.1', '1.1.1.1', '1.1.1.1', '1.1.1.1', '1.1.1.1', '1.1.1.1')
$switches = @('www.google.com', 'www.naver.com')
$servers = @('www.google.com', 'www.naver.com')
$timeout = 1000
$task = $computers | % {
[Net.NetworkInformation.Ping]::new().SendPingAsync($_, $timeout)
}
$task2 = $switches | % {
[Net.NetworkInformation.Ping]::new().SendPingAsync($_, $timeout)
}
$task3 = $servers | % {
[Net.NetworkInformation.Ping]::new().SendPingAsync($_, $timeout)
}
Function GetStatus($task) {
$width = (Get-Host).UI.RawUI.MaxWindowSize.Width
$cols = [Math]::Floor($width/27)
[System.Collections.ArrayList]$online = @()
[System.Collections.ArrayList]$offline = @()
[Threading.Tasks.Task]::WaitAll($task)
$task.Result | % {
$addr = $_.Address.IPAddressToString
if($_.Status -eq 'Success') {
$online += "[$($addr): Online]".PadRight(26, ' ')
} else {
$offline += "[$($addr): Offline]".PadRight(26, ' ')
}
}
if($online.Count*27 -gt $cols*27) {
for($i=$cols; $i -lt $online.Count; $i+=$cols+1) {
$online.Insert($i, "`n")
}
}
if($offline.Count*27 -gt $cols*27) {
for($i=$cols; $i -lt $offline.Count; $i+=$cols+1) {
$offline.Insert($i, "`n")
}
}
Write-Host ' ' -NoNewline
Write-Host $online -ForegroundColor Green
Write-Host ' ' -NoNewline
Write-Host $offline -ForegroundColor Red
}
while(1) {
clear
Get-Date
Write-Host ''
# Computers
Write-Host 'Computer Status'
GetStatus($task)
# Switches
Write-Host ' '
Write-Host 'Network Switch Status'
GetStatus($task2)
# Servers
Write-Host ' '
Write-Host 'Server Status'
GetStatus($task3)
sleep 2
}
비동기 ping 스크립트의 응용 버전입니다.
[PowerShell] 비동기 PING 스크립트
$net = "192.168.75"$ips = 1..254$timeout = 2000$online = @()$ips = $ips | % { "$($net).$_" }$task = $ips | % { [Net.NetworkInformation.Ping]::new().SendPingAsync($_, $timeout)}[Threading.Tasks.Task]::WaitAll($task)$task.Result | where Status -eq 'Success'
iseop.tistory.com
똑같이 SendPingAsync()와 WaitAll()을 사용합니다.
호스트 종류별로 세 가지의 태스크를 만들고, 함수 매개변수에 전달해서 화면을 출력합니다.
String.PadRight()를 통해서 문자열을 일정한 길이로 만들고, 화면 너비에 비례하여 ArrayList의 정해진 위치에 라인 피드 문자를 넣습니다.
끝.