我想通过 PowerShell 弹出/卸载外部 USB 驱动器。
意思是,我想准确复制这些 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