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

如何在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

代码说明

  1. 关联查询:通过ASSOCIATORS OF语法,自动帮你把Win32_LogicalDisk(逻辑盘)→Win32_DiskPartition(分区)→Win32_DiskDrive(物理盘)关联起来,保证每个逻辑盘对应正确的物理盘信息;
  2. 结构化对象:用[PSCustomObject]创建符合你要求的对象,每个磁盘的所有属性都在一个对象里;
  3. JSON输出:最后用ConvertTo-Json直接生成你要的标准JSON数组,不用手动拼接格式。

运行这段代码后,你就能得到和预期格式一致的结果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:49:05