web-dev-qa-db-ja.com

コマンドラインから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
3
Bita

@JoseZが提供したものに加えて、このワンライナーをPoSH ISEまたはVSCodeに配置すると、色分けが構文エラーを示していることがわかります。点線のプロパティは黒色である必要があるため、.Namespace、.ParseName、および.InvokeVerbは文字列として表示され、色で示されるため、失敗します。

この方法で試してみてください。すべての変数を削除するだけで、余分な引用符をすべて削除できます。

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

私のシステムの1つでテストするので、これが記述どおりに機能することがわかります。

最後に、これにPoSHを使用することができ、計画しているのに、なぜバッチファイルを使用するのでしょうか。

1
postanote

引用符の規則について この記事では、PowerShellで一重引用符と二重引用符を使用するための規則について説明しています。使用する

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

または( cmdの内側の二重引用符もエスケープする必要があります

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

ただし、 Powershellベストプラクティスソース は後者を非推奨にします:回避することをお勧めします文字列に変数またはエスケープシーケンスがない場合は二重引用符で囲み、一重引用符を使用します。

1
JosefZ