如何在PowerShell中正确格式化磁盘信息对象?
解决PowerShell整合驱动器信息的问题
我来帮你搞定这个麻烦!你的原命令有几个核心问题:一是没把逻辑驱动器和物理磁盘正确关联起来,二是用wmic的方式不对,导致每个属性都生成了独立对象,格式自然混乱。
原命令的问题分析
- 你用的
% { ... }没有前置的管道输入,$_根本不知道指代什么,等于瞎遍历; - 直接调用
wmic get会返回带表头和空行的文本,不是单个属性值,塞到对象里自然格式乱; - 最关键的:逻辑磁盘(比如C:、D:)和物理磁盘(Intel、Seagate的硬盘)是通过磁盘分区关联的,不能硬凑,否则会把所有物理盘的属性和逻辑盘乱匹配。
正确的解决方案
用PowerShell更现代的Get-CimInstance来替代wmic,它返回的是结构化对象,还能通过关联查询自动把逻辑盘、分区、物理盘关联起来。直接上代码:
# 获取所有本地逻辑磁盘(DriveType=3代表固定硬盘,排除网络驱动器、光驱等) $logicalDisks = Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType=3" # 遍历每个逻辑磁盘,整合对应物理盘的信息 $driveInfoCollection = foreach ($disk in $logicalDisks) { # 关联逻辑磁盘对应的分区 $partition = Get-CimInstance -Query "ASSOCIATORS OF {Win32_LogicalDisk.DeviceID='$($disk.DeviceID)'} WHERE AssocClass=Win32_LogicalDiskToPartition" if ($partition) { # 通过分区关联对应的物理磁盘 $physicalDisk = Get-CimInstance -Query "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='$($partition.DeviceID)'} WHERE AssocClass=Win32_DiskDriveToDiskPartition" if ($physicalDisk) { # 创建你要的结构化对象 [PSCustomObject]@{ letter = $disk.DeviceID volumeName = $disk.VolumeName brand = $physicalDisk.Caption mediaType = $physicalDisk.MediaType } } } } # 输出成你需要的标准JSON格式 $driveInfoCollection | ConvertTo-Json
代码说明
- 关联查询:通过
ASSOCIATORS OF语法,自动帮你把Win32_LogicalDisk(逻辑盘)→Win32_DiskPartition(分区)→Win32_DiskDrive(物理盘)关联起来,保证每个逻辑盘对应正确的物理盘信息; - 结构化对象:用
[PSCustomObject]创建符合你要求的对象,每个磁盘的所有属性都在一个对象里; - JSON输出:最后用
ConvertTo-Json直接生成你要的标准JSON数组,不用手动拼接格式。
运行这段代码后,你就能得到和预期格式一致的结果啦!
内容的提问来源于stack exchange,提问作者Un1
相关产品推荐
相关产品推荐

