Out-Gridview无法对服务器磁盘信息排序问题求助
问题分析与修正方案
你的脚本存在几个关键问题,直接导致了排序失效:
- 管道传递断裂:
Invoke-Command的远程执行结果没有通过管道传递给后续的Select-Object,相当于你每执行完一次远程命令,就单独跑了一遍Select-Object,它根本没拿到任何磁盘对象,自然做不了排序和正确展示。 - 参数用法错误:
Select-Object的-InputObject是用来传递单个对象的,批量处理对象必须用管道|来传递,你当前的写法完全没用到远程返回的数据。 - 属性名称错误:
Get-PSDrive返回的对象里,已用空间属性是Used,空闲空间是Free,你写的usedspace、freespace是不存在的,会导致对应列显示为空。 - 循环内重复弹窗:当前脚本每处理一台服务器就弹出一个GridView,既不利于统一查看,也会让排序效果分散,无法实现全局排序。
修正后的脚本
# 读取服务器列表 $servers = Get-Content "path.txt" # 批量收集所有服务器的磁盘信息并处理 $diskStats = Invoke-Command -ComputerName $servers { # 只过滤出文件系统类的磁盘驱动器,排除注册表、证书等非磁盘项 Get-PSDrive | Where-Object { $_.Free -gt 0 -and $_.Provider.Name -eq 'FileSystem' } } | Select-Object @{Name='盘符'; Expression={$_.Root}}, @{Name='已用空间(GB)'; Expression={[math]::Round($_.Used/1GB, 2)}}, @{Name='空闲空间(GB)'; Expression={[math]::Round($_.Free/1GB, 2)}}, PSComputerName | Sort-Object 盘符 -Descending # 统一展示所有结果 $diskStats | Out-GridView -Title "多服务器磁盘空间统计"
核心改进说明
- 利用
Invoke-Command本身的多计算机并行处理能力,省去手动foreach循环,效率更高 - 增加了文件系统驱动器过滤,避免把非磁盘的驱动器(如注册表)混入结果
- 把字节单位转换为更易读的GB,并保留两位小数,同时将属性名改为中文,提升可读性
- 先收集所有服务器的结果,再统一排序、展示,确保全局排序生效
- 给
Out-GridView添加标题,让界面更清晰
内容的提问来源于stack exchange,提问作者MjrPayne
相关产品推荐
相关产品推荐

