在PowerShell中获取USB驱动器的盘符

6
我曾看到过一些用C#和其他语言编写的文章,它们解释了如何实现我想要的功能,但我不知道如何将它们转换成PowerShell。
以下链接说明了如何获得答案:
如何获取USB设备的驱动器号码?
Win32_DiskDrive-> Win32_DiskDriveToDiskPartition -> Win32_DiskPartition -> Win32_LogicalDiskToPartition -> Win32_LogicalDisk
由 GEOCHET 给出的答案同样解释了如何获得答案,但也不是使用 PowerShell: 如何找到USB驱动器的字母?
6个回答

9

尝试:

gwmi win32_diskdrive | ?{$_.interfacetype -eq "USB"} | %{gwmi -Query "ASSOCIATORS OF {Win32_DiskDrive.DeviceID=`"$($_.DeviceID.replace('\','\\'))`"} WHERE AssocClass = Win32_DiskDriveToDiskPartition"} |  %{gwmi -Query "ASSOCIATORS OF {Win32_DiskPartition.DeviceID=`"$($_.DeviceID)`"} WHERE AssocClass = Win32_LogicalDiskToPartition"} | %{$_.deviceid}

测试了插入一个及多个USB设备。


谢谢,以防万一,如果有人想要非别名版本:Get-WmiObject Win32_diskdrive | Where-Object {$.interfacetype -eq "USB"} | ForEach-Object {Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskDrive.DeviceID="$($_.DeviceID.replace('\','\\'))"} WHERE AssocClass = Win32_DiskDriveToDiskPartition"} | ForEach-Object {Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskPartition.DeviceID="$($_.DeviceID)"} WHERE AssocClass = Win32_LogicalDiskToPartition"} | ForEach-Object {$.deviceid} - resolver101
感谢您抽出时间写答案 :-) - resolver101
如果您运行的shell是cmd.exe(这在一些旧语言的shell执行子例程中是这样的),则需要转义引号并像这样运行:powershell -noprofile "gwmi win32_diskdrive | ?{$_.interfacetype -eq \"USB\"} | %{gwmi -Query \"ASSOCIATORS OF {Win32_DiskDrive.DeviceID="$($.DeviceID.replace('','\'))\"} WHERE AssocClass = Win32_DiskDriveToDiskPartition\"} | %{gwmi -Query \"ASSOCIATORS OF {Win32_DiskPartition.DeviceID="$($.DeviceID)\"} WHERE AssocClass = Win32_LogicalDiskToPartition\"} | %{$_.deviceid}" - ijustlovemath

7

我知道这个主题已经被搁置了一段时间,但由于我经常回来查看,所以我想稍微更新一下。

如果使用的是Windows 7或更高版本,则一个更简单的解决方案是:

Get-WmiObject Win32_Volume -Filter "DriveType='2'"

如果你想避免魔法数字:

Get-WmiObject Win32_Volume -Filter ("DriveType={0}" -f [int][System.IO.DriveType]::Removable)

References:
https://learn.microsoft.com/en-us/previous-versions/windows/desktop/vdswmi/win32-volume
https://learn.microsoft.com/en-us/dotnet/api/system.io.drivetype


请注意,在Win32_Volume中,Windows不一定将所有USB卷挂载为DriveType 2(可移动磁盘)。启用磁盘写入缓存的USB硬盘将作为DriveType 3(本地磁盘)挂载,这是任何标准控制器附加卷所显示的内容。 - Bacon Bits

5
get-volume | where drivetype -eq removable | foreach driveletter

volume | ? drivetype -eq removable | % driveletter

2
现在应该是最佳答案。 - Random Tourist
这些答案是最简单的。谢谢! - Tensigh

4

从PowerShell v3.0开始,微软引入了Get-Cim*命令,使得这个过程比Get-WmiObject ASSOCIATORS查询方法更加简便。

Get-CimInstance -Class Win32_DiskDrive -Filter 'InterfaceType = "USB"' -KeyOnly | 
    Get-CimAssociatedInstance -ResultClassName Win32_DiskPartition -KeyOnly |
    Get-CimAssociatedInstance -ResultClassName Win32_LogicalDisk |
    Format-List *

或者:

Get-CimInstance -Class Win32_DiskDrive -Filter 'InterfaceType = "USB"' -KeyOnly |
    Get-CimAssociatedInstance -Association Win32_DiskDriveToDiskPartition -KeyOnly |
    Get-CimAssociatedInstance -Association Win32_LogicalDiskToPartition |
    Format-List *

上述命令是等价的。

0
$FlashDrives = (get-volume | Where-Object drivetype -eq removable).DriveLetter


foreach($elment in $FlashDrives)
{ 
    if($null -eq $elment)
    {
    
    }
    else
    {
       $FlashDriveLetter = $elment + ":\"
       Write-Host $FlashDriveLetter
    }
}

$HardDiskDrives = (get-volume | Sort-Object -Property DriveLetter | Where-Object drivetype -eq Fixed).DriveLetter

foreach($elment in $HardDiskDrives)
{ 
    if($null -eq $elment)
    {
    
    }
    else
    {
       $HardDiskDriveLetter = $elment + ":\"
       Write-Host $HardDiskDriveLetter
    }
}

0

这段代码在Powershell 7.3.4中获取一个USB驱动器的盘符,并将其存储在变量$DRIVE中。在Get-WmiObject无法工作且USB驱动器显示为固定磁盘(与Get-Volume相同)的情况下使用。

$DRIVE = (Get-CimInstance -Class Win32_DiskDrive -Filter 'InterfaceType = "USB"' -KeyOnly | Get-CimAssociatedInstance -ResultClassName Win32_DiskPartition -KeyOnly | Get-CimAssociatedInstance -ResultClassName Win32_LogicalDisk).DeviceID


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接