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

Powershell如何合并命令输出 关联磁盘盘符与MediaType属性

实现方案

你可以通过物理磁盘编号作为中间关联键,打通逻辑盘盘符和MediaType属性的对应关系,以下是两种实现方式:

方案1:单条命令直接输出完整关联结果(推荐,Node.js可直接解析JSON输出)

直接在你找到的关联逻辑基础上,先预取所有物理磁盘的MediaType映射,再合并到结果中:

# 预加载物理磁盘编号与MediaType的映射表
$phyDiskMap = @{}
Get-CimInstance -Namespace root\Microsoft\Windows\Storage -ClassName MSFT_PhysicalDisk | ForEach-Object {
    $phyDiskMap[[int]$_.DeviceID] = @{
        MediaType = $_.MediaType
        MediaTypeText = switch($_.MediaType) {
            3 { "HDD" }
            4 { "SSD" }
            5 { "SCM" }
            default { "Unknown" }
        }
    }
}
# 关联磁盘、分区、逻辑盘,合并MediaType
Get-CimInstance Win32_DiskDrive | ForEach-Object {
  $disk = $_
  $partitions = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='$($disk.DeviceID)'} WHERE AssocClass = Win32_DiskDriveToDiskPartition"
  Get-CimInstance -Query $partitions | ForEach-Object {
    $partition = $_
    $drives = "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='$($partition.DeviceID)'} WHERE AssocClass = Win32_LogicalDiskToPartition"
    Get-CimInstance -Query $drives | ForEach-Object {
      [PSCustomObject]@{
        Disk        = $disk.DeviceID
        DiskSize    = $disk.Size
        DiskModel   = $disk.Model
        Partition   = $partition.Name
        RawSize     = $partition.Size
        DriveLetter = $_.DeviceID # 盘符,比如C:
        VolumeName  = $_.VolumeName
        Size        = $_.Size
        FreeSpace   = $_.FreeSpace
        MediaType   = $phyDiskMap[[int]$disk.Index].MediaType # 数值:3=HDD,4=SSD
        MediaTypeText = $phyDiskMap[[int]$disk.Index].MediaTypeText # 可读类型
      }
    }
  }
} | ConvertTo-Json # 直接输出JSON格式,Node.js无需额外解析

方案2:分开调用命令,Node.js侧合并结果

如果你需要分开执行命令,分别获取结果后在Node.js中合并,可运行以下两个命令,用物理磁盘编号作为共同键关联即可:

命令1:获取逻辑盘与对应物理磁盘编号的映射(输出JSON)
Get-CimInstance Win32_DiskDrive | ForEach-Object {
  $disk = $_
  $partitions = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='$($disk.DeviceID)'} WHERE AssocClass = Win32_DiskDriveToDiskPartition"
  Get-CimInstance -Query $partitions | ForEach-Object {
    $drives = "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='$($_.DeviceID)'} WHERE AssocClass = Win32_LogicalDiskToPartition"
    Get-CimInstance -Query $drives | ForEach-Object {
      [PSCustomObject]@{
        PhysicalDiskId = [int]$disk.Index
        DriveLetter = $_.DeviceID
        VolumeName = $_.VolumeName
        Size = $_.Size
        FreeSpace = $_.FreeSpace
      }
    }
  }
} | ConvertTo-Json
命令2:获取物理磁盘编号与MediaType的映射(输出JSON)
Get-CimInstance -Namespace root\Microsoft\Windows\Storage -ClassName MSFT_PhysicalDisk | ForEach-Object {
  [PSCustomObject]@{
    PhysicalDiskId = [int]$_.DeviceID
    MediaType = $_.MediaType
    MediaTypeText = switch($_.MediaType){3{'HDD'}4{'SSD'}5{'SCM'}default{'Unknown'}}
  }
} | ConvertTo-Json

注意事项

  • Win32_DiskDrive的Index属性与MSFT_PhysicalDisk的DeviceID属性是一一对应的整数,作为关联键不存在冲突
  • 所有命令使用Get-CimInstance替代已过时的Get-WmiObject,兼容Windows 8/Server 2012及以上系统
  • 输出直接转JSON格式,Node.js调用后可直接用JSON.parse()解析,无需处理文本格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:09:02