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
相关产品推荐
相关产品推荐

