こうした失敗を繰り返さないためにはコマンドプロンプトとWindows PowerShellを正しく使い分ければよい話なのですが、先日、Windows PowerShellのスペシャリストの方に「--%記法」なるものを教示していただきました。Windows PowerShell内でコマンドやアプリケーションを実行する際、引数の前に「--%」を追加してあげれば、コマンドプロンプトにおける引数と同じように扱ってくれるというのです(画面4)。
例えば、コマンドプロンプトで「bcdedit /enum {current}」と入力すると、現在起動しているWindowsのブート構成データを参照できます。これをWindows PowerShellから実行するには、次のいずれかのコマンドラインを実行すればよいのです。「--%」はWindows PowerShell以外のコマンドやスクリプト、アプリケーションの後なら、引数の最初でも途中でも構わないようです。
PS C:\> bcdedit --% /enum {current}
PS C:\> bcdedit /enum --% {current}
PS C:\> cmd.exe --% /c bcdedit /enum {current}
コマンドプロンプトでは、システムおよびユーザー環境変数を「%temp%」や「%path%」のように表記することで参照できます。Windows PowerShellでは、「$env:temp」「$env:path」のように表記することで環境変数を参照できます。環境変数もまた、いま自分がコマンドプロンプトで作業しているのか、Windows PowerShellで作業しているのかで操作ミスを誘発することになるかもしれません。
Windows PowerShell内で実行するコマンドやアプリケーション、スクリプトの引数として環境変数を渡す際にも「--%」を利用できます。「Cscript.exe」で動作する簡単なWSHスクリプト「echoarg.vbs」を作成して試してみました(画面5)。「echoarg.vbs」は、1つ以上の引数が与えられると、その引数を標準出力に表示するものです。
Windows PowerShell内で「echoarg.vbs」の引数に「%temp%」や「%path%」を指定すると、「%temp%」や「%path%」という文字列がそのまま引き渡されてしまいます。本来は「$env:temp」「$env:path」で指定するべきですが、「--% "%temp%" "%path%"」と指定することもできます(画面6)。
「--%記法」について公式なドキュメントをお探しなら、以下のドキュメントの「8.2 Pipeline statements」にある「verbatim-command-argument」を参照してください。Windows PowerShell 3.0向けの古いドキュメントですが、筆者が見つけることができた「--%記法」について説明している最新のドキュメントになります。
「--%記法」を知っていると、Windows PowerShellのスクリプトで外部コマンドやアプリと連携する際に便利です。でも、コマンドプロンプトとWindows PowerShellのどちらで操作しているのかをしっかり認識していれば、「--%記法」を知らなくても困ることはありません。どちらで操作しているのかうっかり忘れてしまったときに、正確無比なコマンドラインが失敗するというトラブルに遭遇します。うっかり忘れているのですから、「--%記法」がどうのこうのという以前の問題です。
Windows系の記事を書くことが多い筆者としては、そのコマンドラインをコマンドプロンプトで実行するのか、Windows PowerShellで実行するのかを明確にするように今後気を付けたいと思います。
岩手県花巻市在住。Microsoft MVP:Hyper-V(Oct 2008 - Sep 2015)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。マイクロソフト製品、テクノロジを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。
Copyright © ITmedia, Inc. All Rights Reserved.