Windows下同時ping多臺設備(電腦/服務器/主機) - Windows Tips

原理說明

使用PowerShell 的Job管理,同時ping多個 設備(電腦/服務器/主機等),從而比逐個執行有更高的執行速度。

 

引用說明

Job部分代碼,依據SparkDev 的博客(http://www.cnblogs.com/sparkdev/p/8441100.html)優化修改得來。

 

效果展示

 

使用注意事項

運行前準備:修改腳本

  1. 將倒數第3行 的 IP地址,改爲自己的IP清單,用"{IP地址},"分割,請勿換行;
  2. 將倒數第1行 的併發數量,改爲自己期望的併發數,具體取決於電腦性能。

如何運行腳本

  1. 在保存好的 .ps1 文件上,點擊右鍵,選擇“使用Powershell運行”
  2. 如果無此選項,請點擊右鍵,選擇“打開方式->選擇其他程序”,然後找到"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"

已知問題:部分操作系統會提示無權限

  1. 打開開始菜單,找到 PowerShell,右鍵,以管理員身份運行
  2. 輸入命令:set-ExecutionPolicy RemoteSigned
  3. 然後輸入 y 同意執行powershell腳本
  4. 再次嘗試運行腳本

 

腳本代碼

請另存爲 .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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章