コマンドプロンプト -文法-

当ページではコマンドプロンプトの基本的な事柄についてまとめています。

具体的な処理やコードは次のページにまとめています。

コマンドプロンプト -処理-

環境構築・実行方法

コマンドプロンプトはWindows系OSであれば標準搭載されていますので環境構築は不要です。


実行する際は「cmd.exe」からターミナルを起動します。

パスは「%windir%\system32\cmd.exe」のはずです。


あるいは「.bat」形式のファイルにコマンドを記載すれば、そこから実行することもできます。

ただ、cmd.exeから実行する場合と.batファイルから実行するのとでは構文が異なります。

forコマンドの違い

forコマンドをターミナルから起動するのと、.batファイルから起動するのとではループ変数の頭に付ける「%(パーセント)」の数が異なります。

ターミナル版

for %ループ変数 in 対象 do (

処理

)

.batファイル版

for %%ループ変数 in 対象 do (

処理

)

文字コード

コマンドプロンプトでは文字コードを数値として管理しています。

例えば、Shift_JISは「932」、UTF-8は「65001」、UTF-16は「1200」、ASC2は「20127」です。

初期設定ではShift_JISが文字コードに設定されています。


文字コードの確認・変更にはchcpコマンドを利用します。

文字コードの確認

chcp

文字コードの変更

chcp 文字コード対応値

コメントアウト

remコマンドを使用することでコメントアウトができます。

コメントアウト

rem ここがコメントアウトされます

あるいはラベルを用いて疑似的にコメントアウトすることもできます。

疑似コメントアウト

:ここにコメントアウト文を書きます

変数

コマンドプロンプトの変数の取り扱いは、かなり特殊なので、いくつかの項目に分けてまとめます。

宣言と代入

変数への宣言と代入にはsetコマンドを利用します。

注意点として「=」の左右に半角空白を入れてはなりません。

また、値のなかに半角空白を入れてはなりません。

入れたい場合は「"」で挟む必要があります。

宣言と代入

set 変数名=値


通常、入力されたデータは文字列として処理されます。

数値として扱いたい場合は/aオプションを利用します。

正しい例

rem 変数fooに「3」が格納されます

set /a foo=1+2

誤った例

rem 変数fooに「1+2」が格納されます

set foo=1+2

変数の利用

変数を利用する場合は変数名を「%」で挟むと利用できます。

基本(値全体)

rem 「"Hello world."」と出力されます

set foo="Hello world."

echo %foo%


格納された値から特定の文字を置換して出力することもできます。

直前の例ですと「Hello world.」という文章を表現するのにsetコマンドの仕様上、「"」を付ける必要がありました。

そこで「"」を外して純粋な文章だけを出力してみます。

置換(仕様)

set 変数名=値

echo %変数名:置換対象=置換後の値%

置換(具体例)

rem 「Hello world.」と出力します

set foo="Hello world."

echo %foo:"=%


最後に、特定の値を抽出する方法を載せます。

変数fooに「0123456789」という文字列を代入し、そこから特定の抽出方法を実行します。

いくつかありますので列挙します。

%変数名:~x%

rem 文頭x文字切り捨てて出力します

rem 以下の場合「456789」と出力されます

set foo=123456789

echo %foo:~3%

%変数名:~-x%

rem 文末からx文字目を出力します

rem 以下の場合「789」と出力されます

set foo=123456789

echo %foo:~-3%

%変数名:~x,y%

rem 文頭x文字を切り捨てて、残った文字列の文頭からy文字を出力します

rem 以下の場合「34567」と出力されます

set foo=123456789

echo %foo:~3,5%


rem xに0を指定するか、あるいは省略すると文頭の切り捨てが行われません

rem 以下の場合は「123」と出力されます

echo %foo:~0,3%

echo %foo:~,3%

%変数名:~-x,y%

rem 文末x文字目からy文字出力する

rem 以下の場合は「567」と出力されます

set foo=123456789

echo %foo:~-5,3%

%変数名:~x,-y%

rem 文頭x文字を切り捨てて、文末y文字切り捨てて出力します

rem 以下の場合「2345678」と出力されます

set foo=123456789

echo %foo:~1,-1%

%変数名:~-x,-y%

rem 文末x文字目から、文末y文字を切り捨てて出力します

以下の場合は「56」と出力されます

set foo=123456789

echo %foo:-5,-3%

特殊な変数

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

「CD」はカレントディレクトリの絶対パスが格納されています。

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

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

「ERRORLEVEL」は直前の処理の戻値が入っています。

ラベル

ラベルとはコード中に設置された目印のようなものです。

文頭に「:」を付けることでラベルとなります。

ラベルの宣言

:ラベル名

ラベル自体には何ら処理を実行しません。

callコマンド、gotoコマンドを利用することで意味を持ちます。

処理を担わないのでコメントアウトの代わりにもなります。


callコマンドを実行するとラベル以下をルーチンとして処理します。

使用例

rem ラベル名に「:」は必要です。

call :ラベル名

gotoコマンドを実行するとラベルの位置に移動します。

使用例

rem ラベル名に「:」は不要です。

goto ラベル名

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

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

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

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

forコマンド

forコマンドを利用することで繰り返し処理ができます。

指定したファイル全てに同じ処理を実行することができます。

文法

for ループ変数 in (ファイル) do (

処理

)

/dオプション

/dオプションを利用すると対象をファイルからディレクトリにします。

for /d ループ変数 in (ディレクトリ) do (

処理

)

/lオプション

/lオプションを利用すると他の言語のfor文のように動作させることができます。

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

for /l ループ変数 in (開始値,ステップ値,終了値) do (

処理

)

/rオプション

/rオプションを利用すると対象の範囲をサブディレクトリにまで拡大することができます。

また、他のオプションを併用することができます。

for /r ループ変数 in (ファイル) do (

処理

)

ifコマンド

ifコマンドにはif文とfalse文が用意されています。

他の言語で見かけるelseif文は用意されていません。


文法は以下の通りです。

注意点として、括弧の左右に半角空白を挿れることを忘れてはなりません。

また、else文を省略することができます。

加えて、if文だけのとき処理が1コマンドの場合は括弧を省略できますが

文法

if 条件式 (

処理

) else (

処理

)

また、ifの直後に「not」を置くことで条件式が逆転します。

文法

if not 条件式 (

処理

) else (

処理

)


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

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

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

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

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

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

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

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

defined条件式

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

文法

if defined 変数名 (

処理

) else (

処理

)

errorlevel条件式

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

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


ところでerrorlevel条件式の利用は使いにくいので個人的には非推奨です。

errorlevel変数と演算子を使うほうが良いと思います。

errorlevel条件式(非推奨)

if errorlevel 値 (

処理

) else (

処理

)

errorlevel変数と演算子(推奨)

if %errorlevel% 演算子 値 (

処理

) else (

処理

)

exist条件式

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

文法

if exist ファイル名 (

処理

) else (

処理

)

エコー機能のON/OFF

実行された処理を表示するエコー機能の設定・解除の方法です。


原則としてエコー機能はONになっています。

ECHOコマンドに続き、「ON」か「OFF」を入力することで設定状態と解除状態を切り替えることができます。

また、コマンド直前に「@」を付けることで、その処理だけOFFにすることもできます。


バッチ処理などで常にOFFにしたい場合は文頭で「@ECHO OFF」と宣言します。