windows - 如何使用 PowerShell 以编程方式弹出锁定的 HDD eSATA 驱动器?
问题描述
我正在尝试通过“Windows 的 USB 托盘图标”弹出 eSATA 硬盘驱动器以安全删除,但这是不可能的,因为“另一个程序正在使用该驱动器”错误(我已经厌倦了这个 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”)
什么也没有发生。
有什么有效的方法可以让它工作吗?
解决方案
不确定,但该.Dismount()
方法的重载定义是:
OverloadDefinitions
-------------------
System.Management.ManagementBaseObject Dismount(System.Boolean Force, System.Boolean Permanent)
所以也许改成:$Vol.Dismount($true, $true)
有效强制下马。
我已经尝试过对此进行测试,但总的来说,我认为您应该使用 CIM cmdlet 而不是-WMI。 Get-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
这似乎确实卸下了驱动器,因为 Explorer 转移了焦点。但是,驱动器仍然可见,单击时可以访问。我从未见过安全弹出消息。似乎卸载驱动器并不等同于安全弹出它。
推荐阅读
- python - 如何打印变量的名称?
- flutter - 如何在容器中创建向内阴影(斜角效果),
- spring - 无法将spring cloud配置服务器添加到spring app
- gradle - Gradle compile vs Gradle Implementation 在使用 gradle 6.9 的 gradle build 中没有产生相同的结果
- node.js - expo build:web docker 找不到正确的入口点
- javascript - 避免重复自己
- swiftui - SwiftUI NavigationLink 自动弹回
- google-admin-sdk - 管理员目录 V1 列表角色
- reactjs - 不确认 Edit on Press ENTER with AG GRID REACT
- php - 为什么我不能在数据库中插入这个查询