Programming Field

コマンドプロンプトでのありがちな失敗と対策 - DOS/コマンドプロンプト コマンド一覧

コマンドプロンプトやバッチファイルを使用する上でよくあるミス・間違いとその対策をまとめてみました。

スペルミス

一番多いのは、単純ですがスペルミスによりコマンドを正しく実行できないケースです。たとえば「Echo」を「Eco」と書いてしまったり、ファイル名を誤って指定しまったりするケースがあります。コマンドプロンプト上でコマンドラインを入力する場合には、(既定では)ファイル名はタブキーを使うことで補完できるため、これを有効活用することでファイル名に関するスペルミスを減らすことができます。

ただし、コマンド名についてはタブキーによる補完を行うことができません。この場合はコマンド一覧などを参考にコピペでコマンドを入力するのが自衛策として有効です。

※ Windowsターミナルでは「Ctrl+V」でペースト(貼り付け)を行うことができますが、従来のコンソールホストでは「Ctrl+V」が使えない場合があります。その場合は右クリックしてメニューを出して「貼り付け」する必要があります。

バッチファイルにおいては、可能であればコマンドを1行ずついったんコマンドプロンプト上で入力して試してみるというのも有効です。また、どのコマンドで誤りがあるかをわかりやすくするため、先頭の「@echo off」を削除してバッチファイルを実行してみたり、要所要所で「pause」コマンドを入れて確認してみるなどでデバッグすることができます。

ファイルパスの区切り文字

Windowsでは、ファイルパスの区切り文字(ディレクトリ名とファイル名をつなげる文字)は「\」になります。一部のコマンドでは「/」を受け付ける場合もありますが、基本的には「\」を使うようにする必要があります。

なお、「\」は非日本語環境ではバックスラッシュ「\」の半角文字に相当する文字です(日本語キーボードであれば「ろ」のキー、またはWindowsにおいてはバックスペースの左隣のキーでも入力できます)。円記号「¥」の半角文字である「¥」を使うと無効なパス名になってしまいます。

パスにスペース文字が含まれる場合の対応

ファイルパスに半角スペースが含まれる場合、原則として「" "」(ダブルクオーテーション)でファイル名を括る必要があります。これは、括らずに指定してしまうと別のパラメーターとして解釈されてしまう恐れがあるためです。例えば、「hoge.exe C:\Program Files」と指定してしまうと、「hoge.exe」にとっては「C:\Program」と「Files」というパラメーターが渡されたものと思ってしまいます。これを、「hoge.exe "C:\Program Files"」のように指定すると、「hoge.exe」は「C:\Program Files」というパラメーターが渡されたものと解釈することができます。

なお、「' '」(シングルクオーテーション)は基本的には引用符として使用できません(主にクロスプラットフォームでサポートされているコマンドで使用できる場合があります)。

※ 「" "」を解釈するかどうかは、厳密にはコマンドに依存します(ただし「" "」を解釈しないコマンドは稀です)。可能であれば一度コマンドを実行して試してみるのがベターです。
※ 「"」文字をパラメーターとして含めたい場合の指定方法もコマンドに依存し、「\"」と書く場合もあれば、「""」と書く場合、「'"'」と書く場合もあります。

権限不足による実行失敗

一部のコマンドは実行に特別な権限を要する場合があります。たとえば「mklink」でシンボリックリンクを作成する場合はシンボリックリンクの作成権限(一般には管理者権限がこれを持っています)が必要です。この場合、必要な権限を持つユーザーでコマンドプロンプトやバッチファイルを実行する必要があります。

「管理者として実行」メニュー

さらに、(Windows Vista以降では)権限を持つユーザーであっても、「権限の昇格」を行わないと権限のないユーザーとして扱われます。「権限の昇格」は、一般にはスタートメニュー内の「コマンドプロンプト」や「ターミナル」を右クリックして現れる「管理者として実行」を行うことで昇格することができます。権限を昇格した場合は、タイトルに「管理者:」というプレフィックスが付くため、これで判別することができます。

ファイルの場所の間違い

ファイル名を指定してコマンドを実行する場合、そのファイル名が絶対パスでない場合、カレントディレクトリから見て存在するファイル名になっているかどうか注意する必要があります。コマンドプロンプト上で手入力でファイル名を入れる場合は、前述の通りタブキーで補完することができますが、バッチファイルを記述する場合はそれができないので特に注意する必要があります。よくあるミスとしては、

  1. バッチファイルと同じディレクトリをカレントディレクトリと勘違いして実行してしまう(バッチファイル起動時のカレントディレクトリは実行方法によって変わります)
  2. 別コマンドを実行する過程でカレントディレクトリが変更されたまま、変更前のカレントディレクトリと勘違いして実行してしまう

などがあります。これを避けるには、

  1. バッチファイルと同じディレクトリをカレントディレクトリとするには、バッチファイルの先頭で「cd %~dp0」を実行する
  2. バッチファイル内のディレクトリ移動をバッチファイルの外に影響させない場合は、バッチファイルの先頭で「setlocal」を記述しておく
  3. ディレクトリ移動を一時的なものにするにはPushdPopdを使用する

などの方法があります。

コマンドの引数の不足または不適切な使用

コマンドの引数(パラメーター)が間違っている場合、当然ながら意図した挙動を得ることができません。特にバッチファイルにおいて起きやすいミスであり、事前にコマンドプロンプト上で実行をテストするなどで対策する必要があります。

なお使用できるコマンドの引数を確認するには、多くのコマンドで「<コマンド名> /?」と「/?」を付けて実行することでヘルプを表示することができます(Curlなど一部のコマンドを除く)。また、コマンド一覧から目的のコマンドを探して使い方を確認することもお勧めします。

応答がないときの強制終了

バッチファイルなどで、コマンドを実行したもののパラメーター間違いやネットワークトラブルなどで応答がない場合は、コマンドを強制終了させるしかない場合があります。コマンドを強制終了させるには、コンソール画面上で「Ctrl+C」(Ctrlを押しながらCを押す)を入力するか、タスクマネージャーを起動(タスクバーを右クリックするかCtrl+Alt+Deleteを入力してメニューを出すことで起動可能です)して実行中のプロセスを強制終了させます。

なお、強制終了した場合どのような状態になるかは不定であるため、単に処理に時間がかかっているだけのものを強制終了させると予期しない状態になる可能性があります。

関連項目