如何替换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
相关产品推荐
相关产品推荐

