如何用PowerShell获取USB集线器插槽对应的驱动器盘符分配?
实现USB集线器物理插槽与驱动器盘符的对应映射
问题背景
Windows会自动为USB设备分配驱动器盘符,需要明确4口USB集线器每个物理插槽对应的设备(盘符/序列号)。设备管理器中「USB大容量存储设备」下的条目以Port_#000x.Hub_#000y格式固定对应物理插槽,但现有命令无法直接关联插槽与盘符:
- 使用
Get-WmiObject Win32_diskdrive | Where-Object {$_.interfacetype -eq "USB"}获取的物理设备ID(如\.\PHYSICALDRIVE1)与实际插槽无固定对应关系 Win32_diskdrive返回的设备ID与Get-CimInstance win32_PnPSignedDriver | where description -like 'USB Mass Storage Device'的设备ID无法直接关联
目标输出为物理插槽与盘符的对应表:
Slot Drive ------------------ ----- 1 D: 2 G: 3 F: 4 E:
解决方案
通过串联多个WMI/CIM类的关联关系,可实现插槽到盘符的映射,步骤如下:
1. 关联USB集线器端口与大容量存储设备
先定位目标USB集线器,再获取每个端口对应的存储设备实例:
# 获取目标USB集线器(可通过Description筛选,比如"4-Port USB Hub") $targetHub = Get-CimInstance Win32_USBHub | Where-Object { $_.Description -match "4-Port USB Hub" } # 获取集线器下所有USB大容量存储设备及其端口信息 $usbStorageDevices = Get-CimInstance Win32_PnPEntity | Where-Object { $_.Description -eq "USB Mass Storage Device" -and $_.PNPDeviceID -match $targetHub.DeviceID } | Select-Object PNPDeviceID, @{Name='PortNumber'; Expression={[int]($_.PNPDeviceID -split 'Port_#000')[1].Substring(0,1)}}
2. 关联存储设备到物理磁盘
通过Win32_USBControllerDevice关联类,把PNP设备ID映射到物理磁盘:
# 构建PNP设备到物理磁盘的映射 $pnpToDisk = @{} Get-CimInstance Win32_USBControllerDevice | ForEach-Object { $pnpDevice = Get-CimInstance -InputObject $_.Dependent if ($pnpDevice.Description -eq "USB Mass Storage Device") { $diskDrive = Get-CimInstance Win32_DiskDrive | Where-Object { $_.PNPDeviceID -eq $pnpDevice.PNPDeviceID } if ($diskDrive) { $pnpToDisk[$pnpDevice.PNPDeviceID] = $diskDrive.DeviceID } } }
3. 关联物理磁盘到逻辑盘符
通过Win32_LogicalDiskToPartition关联类,把物理磁盘ID映射到逻辑盘符:
# 构建物理磁盘到盘符的映射 $diskToDrive = @{} Get-CimInstance Win32_LogicalDiskToPartition | ForEach-Object { $partition = Get-CimInstance -InputObject $_.Antecedent $diskId = $partition.DeviceID -split 'Disk #(\d+)' | Select-Object -Index 1 $diskDeviceID = "\\.\PHYSICALDRIVE$diskId" $drive = Get-CimInstance -InputObject $_.Dependent $diskToDrive[$diskDeviceID] = $drive.DeviceID }
4. 生成最终对应表
整合以上映射,输出插槽与盘符的对应关系:
# 合并数据生成结果 $result = $usbStorageDevices | ForEach-Object { $diskId = $pnpToDisk[$_.PNPDeviceID] $driveLetter = $diskToDrive[$diskId] [PSCustomObject]@{ Slot = $_.PortNumber Drive = $driveLetter ? $driveLetter : "Unused" } } | Sort-Object Slot # 格式化输出 $result | Format-Table -AutoSize Slot, Drive
补充说明
- 若目标集线器的描述不是"4-Port USB Hub",需修改第一步的筛选条件,可通过
Get-CimInstance Win32_USBHub查看所有集线器的描述 - 对于未挂载设备的插槽,会显示"Unused"
- 脚本兼容PowerShell 5.1及以上版本
内容的提问来源于stack exchange,提问作者Lando
相关产品推荐
相关产品推荐

