はじめに
恐怖のエラーメッセージ!
現在のコンピューターは、マウスでカーソルを操作し、指し示したアイコンをクリックすると視覚的に出力が得られるGUI(グラフィカルユーザーインターフェース)が大勢を占めています。しかし、Windowsにおけるコマンドプロンプトのような、CUI(キャラクターユーザーインターフェイス)による操作を必要とする場面は、現在においても存在します。
その代表例がプログラミング言語の学習です。C言語やJava言語などで記述したソースファイルのコンパイルで、まず基礎知識としてコマンドプロンプト上でコマンド入力によって操作する手順を紹介する書籍やウェブサイトが数多くあります。そのようなとき、GUIによる操作しか知らない世代の方には、少なからずぶち当たる大きな壁があります。
それは
'○○○' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
という恐怖のエラーメッセージです。知恵袋においても、なぜこのメッセージが出るのかを問う質問が、未だにかなり高い割合を占めている状況です。このノートでは、コマンドプロンプトがどのようにコマンドを探しているのかを解説し、このエラーを回避する方法を理解していただくことを目的とします。
なお、環境変数設定の操作は、このノートでは解説しません。私の別のノート「WindowsでPATHなどの環境変数を設定する」などを参考にしてください。
コマンド実行の動作を知ろう
ここから先、多少難しい用語が出てきます。末尾に簡単な用語集を作っていますので、そちらを参照しながらお読みいただければと思います。
コマンドはどのように実行されるのか?
まず、コマンドプロンプト上では、フルパスでコマンドを入力すれば、どの場所にいても実行することができます。コマンド名だけで入力したとき、Windowsはまずカレントディレクトリーにそのコマンドが存在するか探します。そこで見つからなかったときには、PATHという環境変数に設定されたディレクトリーを順に探し、それでも見つからなかったときに冒頭のエラーメッセージが表示されるのです。
PATHを確認する
コマンドプロンプト上で、「path」というコマンドを実行すると、現在設定されている環境変数PATHの内容を確認することができます。私の環境(といっても、編集用に少し操作していますが・・・)で実行してみると、次のようになります。
この画像ではわかりづらいので文字で表記すると、
PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\QuickTime\QTSystem\
のようになっています。環境変数PATHは、コマンドをOSに探してもらいたいディレクトリーのフルパスを、セミコロンで区切って羅列したものになっています。
この設定でコマンド名を入力し、カレントディレクトリーにそのコマンドが存在しなかったとき、
- C:\Windows\system32 を探す
- C:\Windows を探す
- C:\Windows\System32\Wbem を探す
- C:\Windows\System32\WindowsPowerShell\v1.0\ を探す
- C:\Program Files (x86)\QuickTime\QTSystem\ を探す
それでも見つからなかったときに、前記のエラーメッセージが表示されるというわけです。
では、エラーが出ないようにするためには?
では、自分がインストールしたはずのプログラムのコマンドを実行しようとしたときにエラーメッセージが出てしまう場合、どうすれば良いのでしょうか?答えは簡単、実行したいコマンドが存在するディレクトリーのフルパスを、環境変数PATHに追加すれば良いのです。
初心者が陥ってしまいがちなのは、
- 書籍などを参考にして作業したが、プログラムのバージョンの変化などによってインストール先が異なっていたにも関わらず、参考物そのままのパスを追加していた
- 単純な入力ミス
のいずれかによって、存在しないディレクトリーを追加してしまったことが原因であることが多いようです。
目的のコマンドが存在する場所を確認しよう
そのようなミスを避けるためには、目的のコマンドが実際にどこに存在するのかを、エクスプローラーなどによって確認することが第一です。「インストールしたファイルの所在がわからない」といった類の質問もよく寄せられますが、Windowsを含むパソコン用の汎用OSには、必ずファイルやディレクトリーを検索するための機能が備わっています。まず、それを活用して目的のコマンドを探すことができることを理解しましょう。
例えば、WindowsにJavaの開発環境であるJDK(Java Development Kit)をインストールし、コマンドプロンプト上でどこでもjavacというJavaソースファイルをコンパイルするためのコマンドを実行できるようにすることを考えてみます。
まず、前述の検索機能を用いて、このjavacというコマンドのファイルがどこにあるのかを探してみましょう。Windows 8であれば、エクスプローラーの右上に検索のためのテキストボックスがあります。
このテキストボックスに、「javac.exe」と入力してみます。
すると、次のように検索結果が表示されます。
検索結果を見れば、javac.exeはここでは「C:\Program Files\Java\jdk1.7.0_25\bin」という場所にあることがわかります。
エクスプローラーで実際にその場所を開いてみれば、確かにjavac.exeが存在していることが確認できるでしょう。
ここで、アドレスバーの右側の空欄部分か、左側のフォルダーアイコン部分をクリックすると、アドレスバーの表示がこのディレクトリーのパス名に変化します。
これをクリップボードにコピーして環境変数PATHに追加すれば、打ち間違いを避けることができます。
コマンドプロンプトを使った作業を行う上で注意すべき点
必ず拡張子を表示する設定にしておこう
Windowsは現在に至るまで、出荷時は「登録されている拡張子は表示しない」というオプションが有効な状態になっています。このオプションが有効になっていると、exeなどのOSに登録された拡張子がエクスプローラー上で見えなくなります。これも、目的のファイルを探す妨げになります。Windowsのフォルダーオプションには、下図のような設定項目があります。この中にある、「登録されている拡張子は表示しない」のチェックを外しておきましょう。
Windows 8であれば、エクスプローラー上のメニューにある「表示」をクリックすると、下図のようなリボンが表示され、その中に「ファイル拡張子」という項目があります。これにチェックを入れても、同じ効果を得ることができます。Windows 95が発売されてから実に17年もの歳月を経て、OS標準機能として拡張子を表示させるための操作が初めて簡略化されたのです。
ディレクトリーの区切り記号に注意しよう
Windowsにおけるディレクトリーの区切り記号には「\」という記号が用いられます。日本語版Windowsのブラウザで閲覧すると、これは「円記号」に見えているはずです。一方で、「/」を逆向きにした記号に見える環境もあることでしょう(これをバックスラッシュと呼びます)。
この記号の文字コードは、16進数の5Cという値に割り当てられています(文字コードの種別によりいろいろ複雑な事情がありますが、ここでは省きます)。実は、この文字コードはかつて「各国で自由な文字を割り当てて良い」という扱いであったため、OSや閲覧するソフトウェアによって見え方が違ってしまうという事態になってしまったのです。これを解消するため、近年主流になっているUnicodeでは円記号に別の独立した文字コードが割り当てられました。
ところが知恵袋の質問の中で、PATHの設定のためにこの新しいコードによる円記号を用いてしまったために、いくら確認しても見た目上は正しいのにコマンドが実行できなかったという事例がありました。その円記号を一体どこから持ってきたのか不思議ではあるのですが(Mac OSの場合はスーパーキーとの組み合わせで入力する方法がありますが)、この点にも注意が必要でしょう。
正確な場所さえ把握すれば何も難しいことはない
目的のコマンドファイルが存在する場所を正確に把握しさえすれば、後は難しいことは何もありません。先に紹介した、パス名をクリップボードにコピーする方法も用いれば、間違えようがないとさえ言えるでしょう。コマンドの場所を確認するために面倒な操作を紹介しましたが、要は「自分がインストールしたプログラムの実行ファイルがどの場所に存在するのか」をしっかり把握し、理解しながら作業をすれば良いのです。
用語集
ディレクトリー
Windowsを始めとするオペレーティングシステムでは、コンピューターの記憶メディア(ハードディスクなど)に格納するファイルの管理のために、木構造(または、ツリー構造)と呼ばれる仕組みを採用しています。ツリー構造では、ディレクトリー(directory)と呼ばれるグループ化のための機構を持っています。ディレクトリーの中にさらにディレクトリーを作り、枝分かれしていく有様を樹木に例えているわけです。その構造の根本に当たる部分を特にルートディレクトリー(root directory)と呼んでいます。
フォルダー
GUIの普及期に、ディレクトリーのことを文具の書類ばさみに例えてフォルダー(folder)と称する製品が現れ、現在ではこちらの呼び名の方が一般的になっています。つまり、「フォルダー=ディレクトリー」と考えて差し支えないわけです。
パス
ファイルやディレクトリーの所在を表す文字列のことをパス(path)といいます。特に、ルートディレクトリーから遡って全てのパスを表現することを、フルパス(または、絶対パス)といいます。
ドライブレター
Windowsにおいては、その前身であるMS-DOSの時代から、フロッピーディスクドライブ、ハードディスクドライブ、CD-ROMドライブなど、ドライブ(外部記憶装置)として認識されるデバイスにアルファベット1文字の名称を与えて管理をしています。この文字のことをドライブレターといいます。UNIX系のOSにはドライブレターは存在しませんが、Windowsの場合はドライブレターまで含めたものが「フルパス」となります。
余談ですが、市販のWindowsパソコンのほとんどは、出荷時のハードディスクドライブの起動ドライブレターがCになっていることでしょう。これは、1984年にIBMが発売した「PC/AT」と呼ばれるパソコンにはフロッピーディスクドライブが2台搭載されていて、これに対応したMS-DOS(Windowsの前身のOS)がフロッピーディスクのドライブレターをAとBにしたことに由来します。現在はフロッピーディスクドライブを標準搭載したパソコンはまず見かけませんが、かつての習慣を引き継いでいるわけです。
カレントディレクトリー
CUIにおける操作では、コマンドによってディレクトリーを移動しながらコマンドの実行やファイル操作などの作業を行います。現在居るディレクトリーのことを、カレントディレクトリーといいます。Windowsでは、コマンドプロンプトでコマンド名のみを入力したときは、暗黙的にカレントディレクトリーが最優先で検索されます。
環境変数
環境変数とは、OSに対して変数名とそれに結び付けられた変数値を設定しておき、そのOS上で動作するタスクがそれぞれ変数名と値を用いることができる、データ共有機能の一種です。このノートではPATHについて解説をしていますが、それ以外にも様々な環境変数が存在します。アプリケーションをインストールしたときに、自動的に環境変数の設定まで行うものも存在します。
改版履歴
(2013/07/27)初版
(2013/07/27)タイトルが長すぎたので改題
(2013/08/03)再び改題と用語集一部文章追加
(2013/09/27)文章を少し修正
(2013/10/18)カテゴリを変える
