如何使用PowerShell批量检查389、53、135等多个端口的状态?
多端口开放状态检查的PowerShell脚本实现
问题描述
我之前用PowerShell写了单个端口的开放检查脚本,代码如下:
$Ipaddress= "xx.xx.xx.xx" $Port= "389" $t = New-Object Net.Sockets.TcpClient $t.Connect($Ipaddress,$Port) if($t.Connected) { "Port $Port is operational" } else { "Port $Port is closed, You may need to contact your IT team to open it. " }
现在需要检查389、53、135等多个端口的状态,期望输出格式为:
Port 389 is operational;Port 53 is operational;Port 135 is operational
请问该如何实现?
解决方案
你可以通过定义端口数组循环遍历检查,最后拼接结果来实现需求,优化后的脚本如下:
$Ipaddress = "xx.xx.xx.xx" # 定义待检查的端口集合,可根据需要增减端口 $Ports = @(389, 53, 135) $checkResults = @() foreach ($Port in $Ports) { $tcpClient = New-Object Net.Sockets.TcpClient try { # 设置1秒连接超时,避免脚本长时间阻塞 $connectSuccess = $tcpClient.ConnectAsync($Ipaddress, $Port).Wait(1000) if ($tcpClient.Connected) { $checkResults += "Port $Port is operational" } else { $checkResults += "Port $Port is closed, You may need to contact your IT team to open it." } } catch { # 捕获连接异常,统一标记为端口关闭 $checkResults += "Port $Port is closed, You may need to contact your IT team to open it." } finally { # 释放TcpClient资源,避免内存占用 $tcpClient.Dispose() } } # 将所有检查结果用分号拼接后输出 $checkResults -join ";"
关键优化点:
- 使用**数组
$Ports**管理需要检查的端口,添加或移除端口只需修改数组内容 - 改用
ConnectAsync+Wait设置超时时间,避免单个端口连接超时导致脚本卡住 - 增加
try/catch/finally块:处理连接异常,同时确保每次检查后释放TcpClient资源 - 最后通过
-join ";"将所有结果拼接成你需要的格式输出
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

