通过Invoke-Command批量执行Test-NetConnection结果异常排查
问题排查与修复
核心问题分析
你的代码存在两个关键错误,导致所有返回结果始终为TRUE:
参数传递逻辑错误
你在主脚本中将整个Test-NetConnection命令拼接成字符串传给myTNC.ps1,但myTNC.ps1里试图用$args[1]获取目标主机——实际上$args在这里是一整个完整的命令字符串,$args[1]取的是字符串的第二个字符(比如命令是Test-NetConnection BBB -Port 8080时,$args[1]就是字符e)。Test-NetConnection对单个字符的目标会默认解析为本地主机,自然返回TRUE。脚本接收参数的逻辑错误
myTNC.ps1的参数接收逻辑完全不符合你的调用场景,没有正确获取目标主机和端口参数。
修复方案
步骤1:修正myTNC.ps1脚本
将脚本改为直接接收目标主机和端口两个参数:
param( [string]$TargetHost, [int]$TargetPort ) Test-NetConnection $TargetHost -Port $TargetPort -InformationLevel Quiet
步骤2:修正主脚本的参数传递逻辑
不再拼接命令字符串,直接传递HostServer和PortNumber两个参数给脚本,同时优化数组添加性能(避免+=频繁扩容):
$MyObjectArray = Import-Csv ".\Sources.csv" # 用ArrayList替代普通数组,提升批量处理性能 $AllObjects = New-Object System.Collections.ArrayList foreach ($item in $MyObjectArray) { $SourceServer = $item.Source $HostServer = $item.Host $PortNumber = [int]$item.Port # 强制转换为整数,避免端口为字符串导致的问题 # 直接传递目标主机和端口作为参数 $result = Invoke-Command -FilePath .\myTNC.ps1 -ArgumentList $HostServer, $PortNumber -ComputerName $SourceServer # 添加结果到集合 [void]$AllObjects.Add([pscustomobject]@{ Source = $SourceServer Dest = $HostServer # 对应预期输出的Dest字段 Port = $PortNumber Result = $result }) } $AllObjects | Export-Csv -Path ".\TestResult.csv" -NoTypeInformation
额外优化建议
- 批量处理1000台服务器时,建议添加
-ThrottleLimit参数控制并发数(比如Invoke-Command -ThrottleLimit 50 ...),避免本地或网络过载。 - 可以添加
try/catch错误处理,捕获无法连接的服务器,避免整个脚本中断。
内容的提问来源于stack exchange,提问作者Dhiraj Jha
相关产品推荐
相关产品推荐

