我正在尝试使用 powershell 卸载外部 USB 驱动器,但无法成功完成。我使用的脚本如下:
#get the Win32Volume object representing the volume I wish to eject
$drive = Get-WmiObject Win32_Volume -filter "DriveLetter = 'F:'"
#call dismount on that object there by ejecting drive
$drive.Dismount($Force , $Permanent)
然后我检查我的计算机以检查驱动器是否已卸载,但事实并非如此。
已尝试使用不同的排列组合来替换布尔参数 $force 和 $permanent,但均无济于事。dismount 命令返回的退出代码在切换参数时会发生变化。
(0,0) = exit code 0
(0,1) = exit code 2
(1,0) = exit code 0
(1,1) = exit code 2
退出代码 2 的文档表明,存在现有挂载点,这是无法卸载的原因。尽管我试图卸载唯一存在的挂载点,但我不确定这个退出代码试图告诉我什么。
我已经在网上搜索过遇到类似问题的人,我只找到了一个可以尝试的附加命令,即以下命令:
# executed after the .Dismount() command
$drive.Put()
这个附加命令没有帮助。
我已经没有什么可以尝试的了,因此,如果有人能给我提供任何帮助,我将不胜感激。
答案1
一个干净的解决方案不会留下任何半生不熟的开放引用,就像来自 pk 的示例一样:
$driveEject = New-Object -comObject Shell.Application
$driveEject.Namespace(17).ParseName("E:").InvokeVerb("Eject")
从...获得http://sushihangover.blogspot.nl/2012/02/powershell-eject-local-or-remote.html
答案2
我无法从 PowerShell 端很好地回答,你可能需要看看如何mountvol
运作.下马有不同程度。
Mountvol 还是 Mountvol /?
显示卷的名称、全局唯一标识符 (GUID) 和位置。
Mountvol [驱动器:]路径 卷名
创建新的卷装入点。指定驱动器号根目录或现有的空 NTFS 目录作为装入点的源,并指定卷名作为目标。
Mountvol [驱动器:]路径/D
删除现有的卷装入点。
Mountvol [驱动器:]路径 /L
列出给定卷装入点的卷名称。
我尝试在 VBScript 中执行类似于您要求的操作,以重新排序旧台式机上的设备,因为旧硬件的驱动器安装太麻烦,无法移除(读取闪存驱动器),这会干扰自定义 GUI 上的快捷方式,我只能明确提及具有特定用途的安装点(D:、E:、F:)。这变得非常令人沮丧,您必须使用 mountvol 输入和输出卸载并重新安装东西,以验证它是否顺利进行并继续进行更改。我希望你的运气比我好。
答案3
Powershell 与 CMD 类似,可以调用具有挂载或卸载磁盘驱动器所需功能的 Win COM 对象,例如 Shell.Application。
在 powershell 中,例如通过 cmd:
powershell "$driveEject = New-Object -comObject Shell.Application; $driveEject.Namespace(17).ParseName(\"E:\").InvokeVerb(\"Eject\"); start-sleep -s 3"
通过 powershell 弹出磁盘还需要将其拔出并重新插入才能重新安装。否则,磁盘可能会被卸载,因此无法访问,直到通过mountvol
或再次安装它diskpart
。
例如使用 mountvol:
REM unmount
mountvol e: /D or /P
REM mount for access
mountvol e: \\?\Volume{device GUID in hex with hyphens}\
mountvol 允许将设备安装到文件夹C:\fakedisk\
例如驱动器号。
例如使用 diskpart:
REM unmount
(
echo select volume 3
echo remove letter=e dismount
) | diskpart
REM mount again for access
(
echo select volume 3
echo assign letter=e
) | diskpart
在 Win 10 cmd 中测试