windows 如何通过PowerShell以编程方式弹出锁定的HDD eSATA驱动器?

hrirmatl  于 2023-05-08  发布在  Windows
关注(0)|答案(1)|浏览(217)

我试图通过弹出eSATA硬盘驱动器“USB托盘图标的Windows”安全删除,但这是不可能的,因为“另一个程序使用的驱动器”错误(我已经厌倦了这个stup@# Windows错误)。
我在PowerShell上尝试了以下代码:

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

还有这个:

$Eject = New-Object -comObject Shell.Application
$Eject.NameSpace(17).ParseName($usbDrvLetter+“:”).InvokeVerb(“Eject”)

什么都没发生。
有什么方法可以让它工作吗?

tez616oj

tez616oj1#

不确定,但.Dismount()方法的重载定义如下:

OverloadDefinitions
-------------------
System.Management.ManagementBaseObject Dismount(System.Boolean Force, System.Boolean Permanent)

所以也许可以改为:$Vol.Dismount($true, $true)有效地强制下马。
我已经试过测试这个,除了一般情况下我认为你应该使用CIMcmdlet而不是 -WMIGet-WMIObject在Windows PowerShell中已弃用,并已从PowerShell Core中删除。
考虑Dismount方法的潜在返回代码(这里有文档)也很重要。

RETURN VALUE   Return code  Description
------------   ------------------------
0              Success
1              Access Denied
2              Volume Has Mount Points
3              Volume Does Not Support The No-Autoremount State
4              Force Option Required

要获取卷示例,请执行以下操作:

$Vol = Get-CimInstance -ClassName Win32_Volume -Filter "DriveLetter = 'E:'"

这显然与旧方法非常相似。但是,调用方法的方式略有不同:

$Vol | Invoke-CimMethod -MethodName Dismount -Arguments @{ Force = $true; Permanent = $true }

ReturnValue PSComputerName
----------- --------------
      2

而且,它似乎没有卸载驱动器。但是,如果我改变参数:

$Vol | Invoke-CimMethod -MethodName Dismount -Arguments @{ Force = $true; Permanent = $false }
ReturnValue PSComputerName
----------- --------------
          0

当资源管理器转移焦点时,这看起来确实是卸载了驱动器。但是,驱动器仍然可见,单击时可以访问。我从来没有看到安全弹出消息。卸载驱动器似乎并不等同于安全弹出它。

相关问题