原理說明
使用PowerShell 的Job管理,同時ping多個 設備(電腦/服務器/主機等),從而比逐個執行有更高的執行速度。
引用說明
Job部分代碼,依據SparkDev 的博客(http://www.cnblogs.com/sparkdev/p/8441100.html)優化修改得來。
效果展示
使用注意事項
運行前準備:修改腳本
- 將倒數第3行 的 IP地址,改爲自己的IP清單,用"{IP地址},"分割,請勿換行;
- 將倒數第1行 的併發數量,改爲自己期望的併發數,具體取決於電腦性能。
如何運行腳本
- 在保存好的 .ps1 文件上,點擊右鍵,選擇“使用Powershell運行”
- 如果無此選項,請點擊右鍵,選擇“打開方式->選擇其他程序”,然後找到"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
已知問題:部分操作系統會提示無權限
- 打開開始菜單,找到 PowerShell,右鍵,以管理員身份運行
- 輸入命令:set-ExecutionPolicy RemoteSigned
- 然後輸入 y 同意執行powershell腳本
- 再次嘗試運行腳本
腳本代碼
請另存爲 .ps1 結尾的文件,如“Run-MultiPing.ps1”
#Ping處理函數
function Run-Ping
{
Param
(
$IPArr,
$parallelcount=1
)
#測試計時開始
$startTime = (Get-Date)
#移除本次會話中已有的所有後臺任務
Remove-Job *
# 使用變量 $taskCount 保存還沒有執行完成的任務數
$taskCount = $IPArr.Length
#判斷設定的並行任務數是否超過當前任務隊列中的任務數
if($parallelCount -gt $IPArr.Length)
{
$parallelCount = $IPArr.Length
}
#啓動初始任務
foreach($i in 1..$parallelCount)
{
$IP = $IPArr[$i - 1]
$PingCmd = [scriptblock]::Create("ping $IP | Select-String `"% (loss|丟失)`"")
Start-Job -ScriptBlock $PingCmd -Name "$IP" | Out-Null
}
#初始任務完成後開始的任務
$nextIndex = $parallelCount
#當任務隊列中還有任務時不斷輪詢已建立的任務,當一個後臺任務結束時刪除這個任務,
#然後從任務隊列中取出下一個任務進行執行,然後等待所有任務執行完成。
while(($nextIndex -lt $IPArr.Length) -or ($taskCount -gt 0))
{
foreach($job in Get-Job)
{
$state = [string]$job.State
if($state -eq "Completed")
{
$JobResult = Receive-Job $job
if($JobResult -like '*(0% loss*' -or $JobResult -like '*(0% 丟失*')
{
Write-Host("成功: " + $job.Name + " " + $JobResult)
}
else {
Write-Warning($job.Name + " " + $JobResult)
}
Remove-Job $job
$taskCount--
if($nextIndex -lt $IPArr.Length)
{
$IP = $IPArr[$nextIndex]
$PingCmd = [scriptblock]::Create("ping $IP | Select-String `"% (loss|丟失)`"")
Start-Job -ScriptBlock $PingCmd -Name "$IP" | Out-Null
$nextIndex++
}
}
}
Start-Sleep 1
}
Write-Host("所有任務已完成,耗時:" + (New-TimeSpan $startTime).totalseconds + '秒')
Write-Host('任意鍵退出') -NoNewline
$null = [Console]::ReadKey('?')
}
Write-Host "開始ping任務"
#定義IP清單
$IPArr = {192.168.1.1},{192.168.1.2},{192.168.1.3},{192.168.1.4},{192.168.1.5},{192.168.1.6},{192.168.1.7},{192.168.1.8},{192.168.1.9},{192.168.1.10},{192.168.1.11},{192.168.1.12},{192.168.1.13},{192.168.1.14},{192.168.1.15},{192.168.1.16},{192.168.1.17},{192.168.1.18},{192.168.1.19},{192.168.1.20}
#ping清單中的IP,設置允許同時運行的任務數量
Run-Ping -IPArr $IPArr -parallelcount 10