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

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

» 2015年11月30日 05時00分 公開
[山市良テクニカルライター]
「Windowsにまつわる都市伝説」のインデックス

連載目次

問題です。どこが間違っているのでしょうか?

 最近のWindows Serverは、CUI(Character User Interface)環境で実行しなければならない操作が多くなりました。次期Windows Server 2016は「Server Core」インストールに加えて、「Nano Server」や「Windows Containers」が登場し、CUIで操作しなければならない場面が増えそうですよ。

 それでは、下の画面1を見てください。これは「Windowsリモート管理(WinRM)」と「Windowsシェル(WinRS)」を使用して、リモートのWindows Serverのブート構成ストアを編集しているところの画面です。

画面1 画面1 CUIの操作例。WinRM/WinRSコマンドを使ってリモートのWindowsのブート構成ストアを編集しているところ

 次に画面2を見てください。同じようなコマンドラインを実行しようとしていますが、なぜかエラーになってしまいます。

画面2 画面2 画面1と同じようなコマンドラインなのに、なぜか失敗してしまう……

 実は、画面2は筆者がよくやってしまう操作ミスの例です。画面のプロンプトをよく見てください。画面1の「C:\>」は、Windows標準の「コマンドプロンプト(cmd.exe)」のプロンプトです。画面2の「PS C:\>」は、「Windows PowerShell」のプロンプトです。コマンドプロンプトで実行する操作をWindows PowerShellの環境で実行したために、コマンドラインがエラーになってしまったのです。

 Windows PowerShellの既定の青い背景なら間違いは少ないでしょうが、CUI環境に慣れてくるとコマンドプロンプトで「powershell.exe」と入力し、素早くWindows PowerShellに切り替えて操作することがあります。その場合、ウィンドウの背景はコマンドプロンプトの黒のままですので、区別がつきにくくなります。

Windows PowerShellでは「{}」をよく使います

 Windows PowerShellにおいても、コマンドプロンプトで実行するコマンドや「Windows Script Host(WSH)」のスクリプト、あるいはアプリケーションをコマンドプロンプトと同じように実行することは可能です。

 しかし、Windows PowerShellにおいて「{}」は、「Invoke-Command」のスクリプトブロックを記述したり、パイプライン(|)の後のフィルターに使用したり、条件分岐のスクリプトブロックに使用したり、変数に連想配列を格納するのに使用したりと、さまざまな場面で使用します(画面3)。

画面3 画面3 Windows PowerShellでは、「{}」をスクリプトブロックや式の一部として多用する

 先ほどの画面2の失敗例では、コマンドプロンプトで実行するコマンドラインに「{}」が含まれていました。そのため、Windows PowerShell上ではWindows PowerShellのルールで処理しようとしたため、コマンドの引数としては正しく処理できずに失敗したのです。

 この種のトラブルは、コマンドプロンプトで操作すべきか、Windows PowerShellで操作すべきかを、きちんと使い分けて作業していれば避けられることです。いま自分がどちらの環境で作業をしているのかを把握していれば間違うことはないのでしょうが、うっかり忘れてしまうというのが人というものです。自分は完全に正しいコマンドラインを実行していると信じているのに、それが失敗すると理由が分からずに遠回りしてしまうことになります。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。