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

 

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