为何Get-Partition无法返回系统所有分区?动态磁盘分区获取方案问询
解决动态磁盘下获取分区及关联Win32_Volume的问题
方法1:用Get-Volume+Get-Disk替代Get-Partition
Get-Partition确实仅支持基本磁盘,但Get-Volume可以识别所有卷(包括动态卷),并且自带AccessPaths属性,完全满足你的需求。通过DiskNumber字段可以直接关联到Get-Disk的磁盘信息,实现卷与磁盘的映射:
Get-Volume | Where-Object { $_.DriveType -in 'Fixed', 'Removable' } | ForEach-Object { $disk = Get-Disk -Number $_.DiskNumber [PSCustomObject]@{ VolumeLabel = $_.FileSystemLabel AccessPaths = $_.AccessPaths -join ';' DiskNumber = $disk.Number DiskType = $disk.DiskType DiskSizeGB = [math]::Round($disk.Size / 1GB, 2) FileSystem = $_.FileSystem } } | Format-Table -AutoSize
方法2:CIM关联查询实现Win32_Volume与磁盘绑定
如果需要直接使用WMI/CIM类,虽然Win32_Volume没有直接的磁盘关联字段,但可以通过CIM的关联类完成映射,同时保留AccessPaths:
Get-CimInstance Win32_Volume | Where-Object { $_.DriveType -eq 3 } | # 过滤固定磁盘 ForEach-Object { $volume = $_ # 获取卷对应的分区(动态卷可能无对应分区,需特殊处理) $partition = Get-CimInstance -Query "ASSOCIATORS OF {Win32_Volume.DeviceID='$($volume.DeviceID)'} WHERE ResultClass=Win32_DiskPartition" if ($partition) { $disk = Get-CimInstance -Query "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='$($partition.DeviceID)'} WHERE ResultClass=Win32_DiskDrive" $diskType = if ($disk.PartitionStyle -eq 'Dynamic') { 'Dynamic' } else { 'Basic' } } else { $disk = Get-CimInstance -Query "ASSOCIATORS OF {Win32_Volume.DeviceID='$($volume.DeviceID)'} WHERE ResultClass=Win32_DiskDrive" $diskType = 'Dynamic' } [PSCustomObject]@{ VolumeDeviceID = $volume.DeviceID AccessPaths = $volume.AccessPaths -join ';' DiskModel = $disk.Model DiskSerial = $disk.SerialNumber DiskType = $diskType } }
方法3:diskpart辅助导出(适合超大规模磁盘场景)
当磁盘数量超过100块时,PowerShell cmdlet可能存在性能瓶颈,此时可以用diskpart导出完整的磁盘/卷列表,再结合Get-Volume补全AccessPaths:
- 创建diskpart脚本文件
diskinfo.txt:
list volume list disk exit
- 在PowerShell中执行并解析:
# 导出diskpart输出 diskpart /s diskinfo.txt | Out-File diskpart_output.txt -Encoding utf8 # 解析卷信息并关联AccessPaths $volumeData = Get-Content diskpart_output.txt | Select-String "^ Volume" | ForEach-Object { $split = $_.Line -split '\s+' | Where-Object { $_ } $volume = Get-Volume -VolumeNumber $split[1] [PSCustomObject]@{ VolumeNumber = $split[1] AccessPaths = $volume.AccessPaths -join ';' DiskNumber = $volume.DiskNumber FileSystem = $split[-3] Size = $split[-2] } } $volumeData | Export-Csv -Path volume_disk_map.csv -NoTypeInformation
内容的提问来源于stack exchange,提问作者Hammer
相关产品推荐
相关产品推荐

