検索
連載

絶対に正しいコマンドラインが失敗して大いに悩むその知識、ホントに正しい? Windowsにまつわる都市伝説(46)(2/2 ページ)

今回は、絶対、正確無比に入力したコマンドラインが失敗してしまうというトラブルの話。原因さえ分かってしまえば簡単なことなのですが……。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

PowerShellのスペシャリストに“コツ”を教えてもらいました

 こうした失敗を繰り返さないためにはコマンドプロンプトとWindows PowerShellを正しく使い分ければよい話なのですが、先日、Windows PowerShellのスペシャリストの方に「--%記法」なるものを教示していただきました。Windows PowerShell内でコマンドやアプリケーションを実行する際、引数の前に「--%」を追加してあげれば、コマンドプロンプトにおける引数と同じように扱ってくれるというのです(画面4)。

画面4
画面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つ以上の引数が与えられると、その引数を標準出力に表示するものです。

画面5
画面5 引数を表示するだけの簡単なWSHスクリプト「echoarg.vbs」。これはコマンドプロンプトで実行した場合の画面

 Windows PowerShell内で「echoarg.vbs」の引数に「%temp%」や「%path%」を指定すると、「%temp%」や「%path%」という文字列がそのまま引き渡されてしまいます。本来は「$env:temp」「$env:path」で指定するべきですが、「--% "%temp%" "%path%"」と指定することもできます(画面6)。

画面6
画面6 WSHスクリプト「echoarg.vbs」をWindows PowerShellから実行する場合のバリエーション

 「--%記法」について公式なドキュメントをお探しなら、以下のドキュメントの「8.2 Pipeline statements」にある「verbatim-command-argument」を参照してください。Windows PowerShell 3.0向けの古いドキュメントですが、筆者が見つけることができた「--%記法」について説明している最新のドキュメントになります。

 「--%記法」を知っていると、Windows PowerShellのスクリプトで外部コマンドやアプリと連携する際に便利です。でも、コマンドプロンプトとWindows PowerShellのどちらで操作しているのかをしっかり認識していれば、「--%記法」を知らなくても困ることはありません。どちらで操作しているのかうっかり忘れてしまったときに、正確無比なコマンドラインが失敗するというトラブルに遭遇します。うっかり忘れているのですから、「--%記法」がどうのこうのという以前の問題です。

 Windows系の記事を書くことが多い筆者としては、そのコマンドラインをコマンドプロンプトで実行するのか、Windows PowerShellで実行するのかを明確にするように今後気を付けたいと思います。

「その知識、ホントに正しい? Windowsにまつわる都市伝説」バックナンバー

筆者紹介

山市 良(やまいち りょう)

岩手県花巻市在住。Microsoft MVP:Hyper-V(Oct 2008 - Sep 2015)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。マイクロソフト製品、テクノロジを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。


Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る