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

通过Invoke-Command批量执行Test-NetConnection结果异常排查

问题排查与修复

核心问题分析

你的代码存在两个关键错误,导致所有返回结果始终为TRUE:

  1. 参数传递逻辑错误
    你在主脚本中将整个Test-NetConnection命令拼接成字符串传给myTNC.ps1,但myTNC.ps1里试图用$args[1]获取目标主机——实际上$args在这里是一整个完整的命令字符串,$args[1]取的是字符串的第二个字符(比如命令是Test-NetConnection BBB -Port 8080时,$args[1]就是字符e)。Test-NetConnection对单个字符的目标会默认解析为本地主机,自然返回TRUE。

  2. 脚本接收参数的逻辑错误
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:37:03