原理说明
使用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