You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 03:25:58