如何将Test-Connection与Test-NetConnection结果合并到同一输出表?
解决方法:合并Test-Connection和Test-NetConnection结果到同一输出表
要实现执行3次Test-Connection,并把它和Test-NetConnection的结果合并成统一的输出表,核心思路是提取两个命令的关键属性,组合成自定义的PowerShell对象。这样不管是成功还是失败的情况,都能统一格式输出。
下面是完整的实现代码,我帮你补全了端口测试的逻辑(假设你要测试的端口是443,你可以按需修改):
$computers = "pc1", "pc2" $targetPort = 443 # 这里改成你实际要测试的端口 $results = @() foreach ($pc in $computers) { # 执行3次ICMP探测,捕获异常情况 $pingResult = try { Test-Connection $pc -Count 3 -ErrorAction Stop } catch { Write-Warning "->$pc<- 无法响应ICMP请求!" $null } # 提取Ping的关键指标:平均响应时间、丢包率 if ($pingResult) { $avgResponse = [math]::Round(($pingResult.ResponseTime | Measure-Object -Average).Average, 2) $packetLoss = "0%" } else { $avgResponse = "无响应" $packetLoss = "100%" } # 执行端口连通性测试 $portResult = try { Test-NetConnection $pc -Port $targetPort -ErrorAction Stop } catch { Write-Warning "->$pc<- 端口测试失败!" $null } # 提取端口测试的关键指标 $portStatus = if ($portResult.TcpTestSucceeded) { "连接成功" } else { "连接失败" } $remoteAddress = $portResult.RemoteAddress ?? "无法解析地址" # 把两个测试的结果组合成自定义对象,存入结果数组 $results += [PSCustomObject]@{ 计算机名称 = $pc 平均响应时间(ms) = $avgResponse 丢包率 = $packetLoss 目标测试端口 = $targetPort 端口连接状态 = $portStatus 远程IP地址 = $remoteAddress } } # 输出最终的合并结果表 $results | Format-Table -AutoSize
代码说明:
- 先定义测试目标列表和端口,用数组
$results统一存储所有结果 - 对每台计算机依次执行两项测试:
- 3次
Test-Connection,捕获异常并给出警告,计算平均响应时间和丢包率 Test-NetConnection端口测试,同样处理异常,提取连接状态和IP地址- 将所有关键指标打包成自定义对象,保证输出格式统一
- 3次
- 最后用
Format-Table输出整齐的结构化表格
你可以根据需求修改属性名称,或者添加更多字段(比如Ping的最小/最大响应时间),灵活性很高。
内容的提问来源于stack exchange,提问作者WebsGhost
相关产品推荐
相关产品推荐

