コマンドプロンプト

コマンドプロンプトはWindows系OSに標準搭載されているシェルです。


仕事などでは、セキュリティの観点から新たなソフトウェアのダウンロード・インストールが制限されている職場が多いため、標準搭載されているコマンドプロンプトは安心して使用できるツールの1つとなります。


Windows7、Windows Server 2008 R2から標準搭載が始まったPowerShellのほうが高性能ですが、古い環境(Windows2000、WindowsXP)では使えないことが多いので、コマンドプロンプトを使う機会は多いのではないでしょうか?


ただし、Linux系で用いられるBashやzshといったシェルに比べると機能・操作性はかなり貧弱です。

それらの扱いに慣れている人ほど、イライラさせられることが多いだろうと思います。

そんなツールでも使わざるを得ないのが悲しいところです……。

文法

実行方法

コマンドプロンプトを実行するには「cmd.exe」というファイルを選択します。

ターミナルが開きますので、そこにコマンドを入力することで処理されます。


あるいは拡張子が「.bat」のWindowsバッチファイルを作成して、そのなかにコマンドを記して実行することも可能です。

ターミナルから動作させるのと、ほとんど違いはありませんが若干文法に違いがありますので注意が必要です。


例えば、for文のループ変数の書き方が微妙に違います。

ターミナルからfor文

FOR%iIN対象DO (処理)

.batファイルからfor文

FOR%%iIN対象DO (処理)

大文字・小文字

コマンドプロンプトでは原則として、アルファベットの大文字と小文字を区別しません。

そのため下記3つのステートメントは全て同じ処理となります。

例1

ECHOHello world.

例2

echoHello world.

例3

eChOHello world.


ただし、if文などで文字列を比較する際は区別されます。

文字コード

標準の文字コードとしてShift_JISが設定されています。

CHCPコマンドを利用することで現在設定されている文字コードを確認・変更することができます。


コマンドプロンプトでは文字コードを数値で表現します。そのため各文字コードに対応した数値を覚えておく必要があります。

代表的なものとしては……

Shift_JIS: 932

UTF-8: 65001

UTF-16: 1200

ASC2: 20127

……といったものが挙げられます。

文字コードの確認

CHCP

文字コードの変更

CHCP文字コード対応値

コメントアウト

コメントアウトにはREMコマンドを利用します。

コメントアウト

REMコメントアウト


あるいは正式な方法ではありませんがラベルを使うテクニックもあります。

ラベル応用のコメントアウト

:コメントアウト


なお、複数行に跨るコメントアウト機能はありません。

変数

コマンドプロンプトにおいても変数を利用することは可能です。


変数の宣言および代入にはSETコマンドを利用します。

注意点として、イコール記号の左側に空白を挿れると正常に動作しなくなります。

また、右側に空白を挿れると空白を含めたデータとして変数に代入されてしまいます。

データは文字列として代入されますのでクォーテーション記号で囲む必要はありません。

基本となる文法

SET変数名=データ


変数には原則として文字列が代入されますので数値を取り扱う場合は下記のように処理します。

数値を取り扱う場合

SET /A変数名=データ

数値同士の計算

SET /Afoo=1+1

変数と数値の計算

SET /Afoo=foo+1

変数同士の計算

SET /Afoo=hoge1+hoge2

特殊な変数

変数のなかには予め値が入っている特殊なものがあります。


以下はそのなかでも特に利用頻度の大きいものです。

「%CD%」はカレントディレクトリの絶対パスが入っています。

「%DATE%」は今日の日付が入っています。

「%TIME%」は現在時刻が入っています。

「%ERRORLEVEL%」は直前のコマンドの終了結果を表すデータが入っています。

ラベルとGOTO・CALL

ラベルとはコード中に設置された目印のようなものです。「:(コロン)」を文頭に付けて、半角空白を入れずに、その後ろにラベル名を続けます。

ラベルの宣言

:ラベル名

ラベルそれ自体には何の機能もありません。

ですのでREMコマンドの代わりにコメントアウトとして用いることができます。


GOTOコマンドを使用すると指定したラベルの場所に移動することができます。

GOTO使用

GOTOラベル(「:」は不要)


CALLコマンドを使用すると指定したラベル以下をルーチンと見なして実行することができます。

CALL使用

CALL :ラベル(「:」は必要)


GOTOコマンドとCALLコマンドの違いはラベルへジャンプ後「EXIT /B」コマンドを処理した後に処理が終わるか、呼び出したところに戻るかです。

GOTOコマンドで移動後、EXIT /Bが来ると処理が終了し、そのターミナルは閉じます。

CALLコマンドで移動後、EXIT /Bが来るとそこで呼び出し元のCALLコマンドの場所に戻り、そこから処理が再開されます。

動作としては一長一短ありますので使い分けが肝心でしょう。

if文

if文(厳密にはIFコマンド)として、ifとelseが用意されています(elseifはありません)。

分岐時の処理内容は括弧で括りますが、括弧の外側に半角空白が無いとエラーになるので注意です。

なお、処理が1コマンドのときは括弧を省略することができます。

基本形

IF条件式(

真のときの処理

) ELSE (

偽のときの処理

)

IFの直後にNOTを置くことで条件式が逆転します。

基本形(NOT版)

IF NOT条件式(

真のときの処理

) ELSE (

偽のときの処理

)


演算子としては次のものが使えます。

「==」は文字列を比較し、等しいとき真となります。

「EQU」は数値を比較し、等しいとき真になります。

「NEQ」は数値を比較し、等しくないとき真になります。

「GTR」は数値を比較し、左方が右方よりも小さいとき真になります。「<」と同じ意味です。

「LSS」は数値を比較し、左方が右方よりも大きいとき真になります。「>」と同じ意味です。

「GEQ」は数値を比較し、左方が右方以下のとき真になります。「<=」と同じ意味です。

「LEQ」は数値を比較し、左方が右方以上のとき真になります。「>=」と同じ意味です。

ERRORLEVEL条件式

ERRORLEVEL条件式では特殊な変数ERRORLEVELを参照し、指定した値以上のとき真になります。

忘れやすいですが「指定した値と等しい」ではなく「指定した値以上」です。

正直、この書き方はおススメしません。

ERRORLEVEL変数自体に演算子を使った条件式で書くべきです。

本来の方法(非推奨)

IF ERRORLEVEL(

真のときの処理

) ELSE (

偽のときの処理

)

演算子を使う(推奨)

IF %ERRORLEVEL%演算子 値(

真のときの処理

) ELSE (

偽のときの処理

)

EXIST条件式

EXIST条件式では指定したファイルが存在するとき真になります。

ファイルの存在比較

IF EXISTファイル名(

真のときの処理

) ELSE (

偽のときの処理

)

DEFINED条件式

DEFINED条件式では指定した変数名が宣言されているとき真になります。

変数の宣言比較

IF DEFINED変数名(

真のときの処理

) ELSE (

偽のときの処理

)

for文

プログラミング言語では必須の機能であるfor文は、コマンドプロンプトにも備わっています。

ただ、特殊な使い方といいますか書き方をしますので注意が必要です。

オプション無し

基本形としてのfor文、もといFORコマンドは他言語でいうところのforeach文に相当します。

指定した条件に従って繰り返すのではなく、1つのループ変数にファイルを入れて、入ったファイルの数だけ繰り返すのです。

ループ変数はターミナルから実行するときは「%アルファベット1文字」で、.batファイルから実行するときは「%%アルファベット1文字」で表記します。

基本形

FORループ変数IN (ファイル) DO (

処理

)

/Dオプション

/Dオプションを使うことで対象をファイルからディレクトリに変更することができます。

基本形

FOR /Dループ変数IN (ディレクトリ) DO (

処理

)

/Rオプション

/Rオプションを使うことで対象の範囲をサブディレクトリにまで広げることができます。

また、/Rオプション使用時は起点となるディレクトリを絶対パス・相対パスで指定することができるようになります。

こちらは省略可能で、省略した場合はカレントディレクトリを起点に対象の範囲が設定されます。

基本形

FOR /Rファイルパス ループ変数IN (ディレクトリ) DO (

処理

)


/Dオプション併用でディレクトリを対象にすることもできます。

ディレクトリを対象とする場合

FOR /D /Rファイルパス ループ変数IN (ディレクトリ) DO (

処理

)

/Lオプション

/Lオプションを採用すると、多くのプログラミング言語に備わるfor文のように動作させることができます。

for文に入るとループ変数に開始値が代入され、1ループごとにステップ値だけループ変数の値が大きくなり、終了値より大きくなるとループを止めます。

基本形

FOR /Lループ変数IN (開始値,ステップ値,終了値) DO (

処理

)