如何在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
关键修改点说明
- 移除
ft -AutoSize的前置调用:Format-Table会把PowerShell对象转换成格式化的文本,一旦经过这个步骤,后续就无法再对对象进行筛选、提取属性等操作。要先完成数据收集,再按需格式化输出。 - 用
Receive-Job的结果直接筛选:Test-Connection返回的结果对象包含StatusCode属性(0表示成功),直接用Where-Object筛选后,通过Select-Object -ExpandProperty Address提取主机地址字符串,直接赋值给$online数组,无需手动初始化后再追加。 - 添加
-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
相关产品推荐
相关产品推荐

