使用 PowerShell 弹出/卸载驱动器

使用 PowerShell 弹出/卸载驱动器

我想通过 PowerShell 弹出/卸载外部 USB 驱动器。

意思是,我想准确复制这些 UI 操作的行为(通过 Windows UI 弹出驱动器):

通过 Windows UI 弹出驱动器

目前我正在使用这个脚本:

$drive_letter="G"
$vol = get-wmiobject -Class Win32_Volume | where{$_.Name -eq $drive_letter+":\"}  
$vol.DriveLetter = $null
$vol.Put()  
$vol.Dismount($false, $false)

这有效,但是,当我再次连接驱动器时,它不会显示在驱动器列表中。我认为这是因为驱动器号与驱动器的 GUID 相关联,并且因为:$vol.DriveLetter = $null

我也尝试过这个:

$driveEject = New-Object -comObject Shell.Application
$driveEject.Namespace(17).ParseName("G:").InvokeVerb("Eject")

但它不起作用。

对于它的价值,$driveEject.Namespace(17).ParseName("G:")返回:

Application  : System.__ComObject
Parent       : System.__ComObject
Name         : Backup (G:)
Path         : G:\
GetLink      :
GetFolder    : System.__ComObject
IsLink       : False
IsFolder     : True
IsFileSystem : True
IsBrowsable  : False
ModifyDate   : 12/30/1899 12:00:00 AM
Size         : 0
Type         : Local Disk

我如何卸载驱动器,以便它执行用户通过 Windows UI 弹出驱动器时执行的精确操作?

答案1

最干净的解决方案是调用 Eject 动词,它会处理所有事情。

$driveEject = New-Object -comObject Shell.Application
$driveEject.Namespace(17).ParseName("E:").InvokeVerb("Eject")

答案2

也有工具可以做到这一点。

微软系统内部组件

https://learn.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite

具体来说

https://learn.microsoft.com/en-us/sysinternals/downloads/sync

sync.exe -accepteula -e x:

然而,总而言之,以上操作正是“@Savchenko Dmitriy”已经给您的操作。

答案3

我遇到了类似的问题。我通过在驱动器号 G:\ 而不是 G: 后添加斜线来解决这个问题

$driveEject = New-Object -comObject Shell.Application
$driveEject.Namespace(17).ParseName("G:\").InvokeVerb("Eject")

答案4

$driveEject.Namespace(17)可在普通 SD 卡和 USB 闪存驱动器上使用。

可能无法与外部 HDD/SSD 配合使用,因为它们被视为 SCSI 设备。对我来说也不行。

我也在寻找这个问题的解决方案(SCSI/USB HDD弹出)。

我看到的最近的选项是通过 rundll 生成安全删除对话框,如果有其他选项可用,我宁愿不使用它(它也有缺陷)。

编辑:以下内容可能适用于不可弹出的 USB/SCSI HDD

$hddDevs = Get-CimInstance -ClassName Win32_DiskDrive
$externalDisks = $hddDevs | Where {$_.MediaType -like "Removable*"} | select PNPDeviceID
Disable-PnPDevice -InstanceId $externalDisks.PNPDeviceID -Confirm:$false
Enable-PnPDevice  -InstanceId $externalDisks.PNPDeviceID -Confirm:$false

相关内容