如何修改PowerShell代码同时获取USB磁盘的deviceID与对应盘符?
解决方法
你可以通过在遍历每个USB磁盘时保留原始的DeviceID,再关联获取对应的盘符,最后输出包含这两个属性的自定义对象,就能得到目标格式的结果。
修改后的代码(基于WMI)
Get-WmiObject Win32_DiskDrive | Where-Object { $_.InterfaceType -eq "USB" } | ForEach-Object { $diskDeviceId = $_.DeviceID # 获取当前磁盘关联的分区 $partitions = Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskDrive.DeviceID=`"$($diskDeviceId.replace('\','\\'))`"} WHERE AssocClass = Win32_DiskDriveToDiskPartition" # 遍历分区获取对应盘符 foreach ($partition in $partitions) { $logicalDisks = Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskPartition.DeviceID=`"$($partition.DeviceID)`"} WHERE AssocClass = Win32_LogicalDiskToPartition" foreach ($disk in $logicalDisks) { # 输出包含磁盘ID和盘符的自定义对象 [PSCustomObject]@{ deviceID = $diskDeviceId driveLetter = $disk.DeviceID } } } } | Format-Table -AutoSize
更推荐的CIM版本(PowerShell 5.1+)
Get-WmiObject已被标记为过时,使用Get-CimInstance和Get-CimAssociatedInstance更简洁可靠:
Get-CimInstance Win32_DiskDrive | Where-Object { $_.InterfaceType -eq "USB" } | ForEach-Object { $diskDeviceId = $_.DeviceID # 关联获取磁盘分区 $partitions = Get-CimAssociatedInstance -InputObject $_ -Association Win32_DiskDriveToDiskPartition foreach ($partition in $partitions) { # 关联获取分区对应的逻辑盘符 $logicalDisks = Get-CimAssociatedInstance -InputObject $partition -Association Win32_LogicalDiskToPartition foreach ($disk in $logicalDisks) { [PSCustomObject]@{ deviceID = $diskDeviceId driveLetter = $disk.DeviceID } } } } | Format-Table -AutoSize
代码说明
- 先筛选出所有USB接口的磁盘,将每个磁盘的
DeviceID存入变量,避免后续管道操作丢失该值 - 依次通过关联类获取磁盘对应的分区、分区对应的逻辑盘符
- 每找到一对磁盘ID和盘符,就生成一个包含这两个属性的自定义对象
- 最后用
Format-Table -AutoSize格式化输出,让列对齐更美观
内容的提问来源于stack exchange,提问作者Lando
相关产品推荐
相关产品推荐

