如何使用PowerShell快速批量测试300+台服务器指定端口连通性
PowerShell 多设备批量端口检测方案
一、方案适用性说明
PowerShell完全适配该场景:无需额外安装第三方工具,原生支持异步TCP检测,300台设备4个端口的全量检测最快可在3秒内完成(依网络环境而定,通常不超过10秒),完全满足批量快速测试的需求。
二、具体实现步骤
2.1 准备工作
- 提前将所有待测试主机名/IP存为纯文本文件
hosts.txt,每行1条记录,和脚本放在同目录即可 - 脚本默认端口超时时间为2000毫秒,可根据实际网络环境调整
2.2 完整测试脚本
# 配置项 $hostPath = ".\hosts.txt" $testPorts = @(389,636,3268,3269) $timeoutMs = 2000 # 读取待测试主机列表 $hostList = Get-Content -Path $hostPath | Where-Object { $_ -notmatch '^\s*$' } # 初始化任务列表 $jobs = @() foreach ($hostname in $hostList) { foreach ($port in $testPorts) { $tcpClient = New-Object System.Net.Sockets.TcpClient $job = $tcpClient.ConnectAsync($hostname, $port) $jobs += [PSCustomObject]@{ Hostname = $hostname Port = $port TcpClient = $tcpClient Task = $job } } } # 等待所有任务完成或超时 Start-Sleep -Milliseconds $timeoutMs # 整理结果 $resultTable = @{} foreach ($job in $jobs) { $status = if ($job.Task.IsCompleted -and $job.TcpClient.Connected) { "通过" } else { "失败" } if (-not $resultTable.ContainsKey($job.Hostname)) { $resultTable[$job.Hostname] = [PSCustomObject]@{ "主机名" = $job.Hostname } } $resultTable[$job.Hostname] | Add-Member -MemberType NoteProperty -Name $job.Port.ToString() -Value $status -Force # 释放资源 $job.TcpClient.Dispose() } # 格式化输出结果 $output = $resultTable.Values | Format-Table -AutoSize -Property "主机名",389,636,3268,3269 Write-Output $output # 可选:导出结果到CSV # $resultTable.Values | Export-Csv -Path ".\端口检测结果.csv" -Encoding UTF8 -NoTypeInformation
2.3 输出示例
运行后返回的结果格式如下:
主机名 389 636 3268 3269 ------- --- --- ---- ---- 服务器1 通过 通过 通过 通过 服务器2 通过 通过 失败 通过 服务器3 失败 通过 通过 通过
三、注意事项
- 若脚本无法运行,可临时调整当前用户的执行策略:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser,测试完成后可执行Set-ExecutionPolicy Restricted -Scope CurrentUser恢复默认 - 若待测试设备数量超过1000台,可适当调高超时时间到3000毫秒,避免网络波动导致的误判
内容的提问来源于stack exchange,提问作者user1547251
相关产品推荐
相关产品推荐

