1

Мне нужна команда, которую я могу поместить в конец командного файла и которая позволит мне безопасно удалить 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

2 ответа2

0

Наряду с тем, что дал вам @JoseZ, если вы поместите эту однострочную строку в PoSH ISE или VSCode, вы увидите, что цветовое кодирование указывает на синтаксические ошибки. Пунктирные свойства должны быть черного цвета, значит, ваши.Пространство имен.ParseName и.InvokeVerb показаны в виде строк, обозначенных цветом и, таким образом, потерпят неудачу.

Попробуйте так, просто отбросив все переменные, исключив при этом лишние кавычки.

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

Проверьте на одной из моих систем, так что я знаю, что это работает как написано

Наконец, поскольку вы можете и планируете использовать PoSH для этого, зачем использовать командный файл?

0

В статье « О правилах цитирования» описаны правила использования одинарных и двойных кавычек в PowerShell. использование

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

или (вам также нужно избегать внутренних двойных кавычек для cmd )

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

Однако источник Powershell Best Practice не одобряет последнее: рекомендуется избегать двойных кавычек, если в строках нет переменных или escape-последовательностей, предпочитайте одинарные кавычки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .