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

如何替换Test-Connection为Test-NetConnection并实现异步作业功能?

替代方案:批量检测服务器5985端口连通性(无-AsJob支持时)

因为Test-NetConnection不支持-AsJob参数,这里提供两种实用的批量异步检测方案,适配不同PowerShell版本:

方案1:用Start-Job手动包装Test-NetConnection

延续你原有代码的后台作业思路,把Test-NetConnection放到独立后台作业中执行:

$online = @()
$pc = Get-Content C:\servers.txt 

# 给每台服务器启动后台检测作业
$jobs = $pc | ForEach-Object {
    Start-Job -ScriptBlock {
        param($computerName)
        # 执行端口检测,忽略单个检测失败的错误
        $testResult = Test-NetConnection -ComputerName $computerName -Port 5985 -ErrorAction SilentlyContinue
        # 返回自定义结果对象
        [PSCustomObject]@{
            ComputerName = $computerName
            Reachable = ($testResult.TcpTestSucceeded -eq $true)
        }
    } -ArgumentList $_
}

# 等待所有作业完成,收集结果并清理作业
$jobs | Receive-Job -Wait -AutoRemoveJob | ForEach-Object {
    if ($_.Reachable) {
        $online += $_.ComputerName
    }
}

$online | Format-Table -AutoSize

方案2:PowerShell 7+ 用ForEach-Object -Parallel(更高效)

如果你的环境是PowerShell 7及以上版本,推荐用并行线程处理,比后台作业资源占用更低、速度更快:

$pc = Get-Content C:\servers.txt 

# 并行检测,直接返回连通的服务器名
$online = $pc | ForEach-Object -Parallel {
    $testResult = Test-NetConnection -ComputerName $_ -Port 5985 -ErrorAction SilentlyContinue
    if ($testResult.TcpTestSucceeded) { $_ }
} -ThrottleLimit 10 # 可根据网络情况调整并发数,避免过载

$online | Format-Table -AutoSize

额外说明

  • 两种方案都添加了-ErrorAction SilentlyContinue,避免单台服务器检测失败时抛出错误中断整体流程
  • 若目标服务器用的是WinRM HTTPS端口(5986),只需修改代码中的-Port参数即可
  • Start-Job会创建独立进程,适合旧版PowerShell;ForEach-Object -Parallel用线程实现,性能更优,优先推荐PowerShell 7+环境使用

内容的提问来源于stack exchange,提问作者unixpipe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:54:56