PowerShell遍历CSV实现主机对应端口网络连通性检测问题
解决PowerShell连通性检测脚本中IP与对应端口配对的问题
你的脚本核心问题是嵌套循环遍历了整个SourceIP列和Port列,导致每个IP和所有端口进行配对检测。要实现每行IP仅检测对应行端口的需求,只需修改循环逻辑,直接遍历CSV的每一行即可。
修改后的脚本
$dest = Import-Csv "C:\temp\dest.csv" $source = (Get-WmiObject Win32_Computersystem).Name # 遍历CSV的每一行,直接获取当前行的IP和对应端口 foreach ($row in $dest) { $targetIP = $row.SourceIP $targetPort = [int]$row.Port # 转换为整数,避免类型匹配问题 try { $tcpClient = New-Object Net.Sockets.TcpClient $tcpClient.Connect($targetIP, $targetPort) if ($tcpClient.Connected) { Write-Host "端口 $targetPort - 已开放`n源主机: $source → 目标主机: $targetIP" -ForegroundColor Green } } catch { $errorMsg = $_.Exception.Message if ($errorMsg -like "*A connection attempt failed*") { Write-Host "端口 $targetPort - 无通信`n源主机: $source → 目标主机: $targetIP" -ForegroundColor Red } elseif ($errorMsg -like "*No connection could be made*") { Write-Host "端口 $targetPort - 已关闭`n源主机: $source → 目标主机: $targetIP" -ForegroundColor Red } else { # 处理未预料的错误类型 Write-Host "端口 $targetPort - 未知错误: $errorMsg`n源主机: $source → 目标主机: $targetIP" -ForegroundColor Yellow } } finally { # 确保释放TCP连接资源 if ($tcpClient) { $tcpClient.Close() $tcpClient.Dispose() } } }
关键修改说明
- 循环逻辑调整:将嵌套循环改为单循环,直接遍历
$dest的每一行(foreach ($row in $dest)),每次迭代可直接获取当前行对应的SourceIP和Port,实现一对一配对检测。 - 类型转换:添加
[int]$row.Port将端口转换为整数,避免字符串类型传入Connect方法时可能出现的异常。 - 资源释放:增加
finally块,确保TCP连接被关闭并释放资源,防止资源泄漏。 - 输出优化:调整输出格式,让检测结果的可读性更强。
内容的提问来源于stack exchange,提问作者gucisz
相关产品推荐
相关产品推荐

