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

如何在PowerShell作业中将在线主机追加到$online数组?

解决PowerShell批量Ping后无法收集在线主机的问题

你的核心问题是原代码最后用了Format-Table(简称ft)把输出转换成了文本格式,丢失了原始对象,导致无法后续筛选收集;另外你之前尝试的$online += $pc逻辑错误,$pc是所有主机的集合,不是当前处理的单个主机,且管道内的变量作用域也会影响赋值。

修改后的代码(直接收集在线主机)

# 直接收集在线主机的地址到数组
$online = Get-Content C:\servers.txt | ForEach-Object {
    # 异步提交ping作业
    Test-Connection -ComputerName $_ -Count 1 -AsJob
} | Get-Job | Receive-Job -Wait -AutoRemoveJob | 
    # 筛选ping成功(StatusCode为0)的结果
    Where-Object { $_.StatusCode -eq 0 } | 
    # 提取主机地址字符串,存入数组
    Select-Object -ExpandProperty Address

# 查看在线主机列表
$online | Format-Table -AutoSize

关键修改点说明

  1. 移除ft -AutoSize的前置调用:Format-Table会把PowerShell对象转换成格式化的文本,一旦经过这个步骤,后续就无法再对对象进行筛选、提取属性等操作。要先完成数据收集,再按需格式化输出。
  2. 用Receive-Job的结果直接筛选:Test-Connection返回的结果对象包含StatusCode属性(0表示成功),直接用Where-Object筛选后,通过Select-Object -ExpandProperty Address提取主机地址字符串,直接赋值给$online数组,无需手动初始化后再追加。
  3. 添加-AutoRemoveJob参数:自动清理完成的ping作业,避免系统中残留大量已完成的作业对象。

另一种写法(保留完整结果对象)

如果需要保留ping结果的完整信息(比如响应时间等),可以去掉-ExpandProperty,让$online存储完整的结果对象:

$onlineResults = Get-Content C:\servers.txt | ForEach-Object {
    Test-Connection -ComputerName $_ -Count 1 -AsJob
} | Get-Job | Receive-Job -Wait -AutoRemoveJob | 
    Where-Object { $_.StatusCode -eq 0 }

# 查看带详细信息的在线主机
$onlineResults | Select-Object Address, ResponseTime, StatusCode | Format-Table -AutoSize

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:45:31