从命令行删除 USB 设备

从命令行删除 USB 设备

我想要一个可以放在批处理文件末尾的命令,它可以允许我安全地删除存储批处理文件的 USB 设备。

我发现了一个可以实现这一点的 powershell 命令,但是当我尝试从 cmd 运行它时它不起作用(“%~d0”是 USB 路径的变量):

powershell -command "$driveEject = New-Object -comObject Shell.Application ; $driveEject.Namespace(17).ParseName("%~d0").InvokeVerb("Eject")"

这是我收到的错误消息:

At line:1 char:93
+ ... ject Shell.Application ; $driveEject.Namespace(17).ParseName(E:).Invo ...
+                                                                  ~
Missing ')' in method call.
At line:1 char:93
+ ... ct Shell.Application ; $driveEject.Namespace(17).ParseName(E:).Invoke ...
+                                                                ~~
Unexpected token 'E:' in expression or statement.
At line:1 char:95
+ ... t Shell.Application ; $driveEject.Namespace(17).ParseName(E:).InvokeV ...
+                                                                 ~
Unexpected token ')' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingEndParenthesisInMethodCall

答案1

关于引用规则本文介绍了在 PowerShell 中使用单引号和双引号的规则。使用

…; $driveEject.Namespace(17).ParseName('%~d0').InvokeVerb('Eject')"

或者(你需要转义内部双引号cmd也)

…; $driveEject.Namespace(17).ParseName("""%~d0""").InvokeVerb("""Eject""")"

然而,电源外壳最佳实践来源弃用后者:如果字符串中没有变量或转义序列,建议避免使用双引号,最好使用单引号

答案2

除了@JoseZ给您的信息外,如果您将此单行代码放入 PoSH ISE 或 VSCode 中,您会看到颜色编码表示语法错误。带点的属性应为黑色,因此,您的 .Namespace、.ParseName 和 .InvokeVerb 显示为字符串,由颜色指示,因此将失败。

尝试这种方式,删除所有变量,从而消除所有多余的引号转义内容。

powershell -command "(New-Object -comObject Shell.Application).NameSpace(17).ParseName('F:').InvokeVerb('Eject')"

在我的一个系统上进行测试,因此我知道它按所写的方式工作。

最后,既然您能够并且计划为此使用 PoSH,那么为什么要使用批处理文件呢?

答案3

CMD 没有实现弹出 USB 驱动器的功能。但是,它可以调用已实现所需功能的 Win COM 对象,例如通过 powershell、VBS、JS 等调用 Shell.Application。

通过 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 中测试

相关内容