Windowsバッチファイル制御構文

WindowsバッチファイルのGOTO文

GOTO文は、実行点をバッチファイル内の任意の箇所へのジャンプします。

GOTO文は以下の形式で記述します。


goto ラベル名

REM ここには到達しません。

:ラベル名 

goto文によるエラー処理

「ERRORLEVEL」変数に直前の実行コマンドの戻り値が格納されるので、これを判定してGOTO文でエラー処理へジャンプします。


@ECHO OFF
c:¥test.exe
if %ERRORLEVEL% NEQ 0 goto FAILURE

:SUCCESS
echo "Successfully."
goto END

:FAILURE
echo "ERROR STOP: %cnt%"

:END
exit

WindowsバッチファイルのIF文(分岐処理)

IFの基本書式

コマンドプロンプトにおける分岐処理は「IFコマンド」を用います。

1行に書く形式とブロック形式の構文が利用できます。


IF 条件 処理

IF 条件 (
    処理
) ELSE IF 条件 (
    処理
) ELSE (
    処理
)

IFの条件記述

条件の箇所には、以下のような条件を指定することができます。


IF [NOT] 文字列1==文字列2 コマンド
IF [NOT] EXIST ファイル名 コマンド
IF [NOT] ERRORLEVEL 番号 コマンド
指定 説明
NOT 条件が偽の場合にだけ、Windows がコマンドを実行することを指定します。
文字列1==文字列2 テキスト文字列が一致するときに条件が真になり、コマンドを実行します。
EXIST ファイル名 指定ファイルが存在するときに条件が真になり、コマンドを実行します。
ERRORLEVEL 番号 直前で実行したコマンドの終了コードが番号以上なら真になり、コマンドを実行します。

コマンド拡張機能が有効(デフォルトで有効)であれば以下のように記述できます。


IF [/I] 文字列 1 比較演算子 文字列 2 コマンド
IF CMDEXTVERSION 番号 コマンド
IF DEFINED 変数 コマンド
指定 説明
/I 文字列は、大文字と小文字を区別せずに比較されます。
比較演算子 EQU(等しい)、NEQ(等しくない)、LSS(より小さい)、LEQ(以下)、GTR(より大きい)、GEQ(以上)から選択します。
CMDEXTVERSION コマンド拡張機能に関連付けられている内部バージョン番号との比較を行います。
DEFINED 環境変数が定義されている場合は真を返します。

IF文の複数条件

ANDやORに相当する機能は無いので、複雑な演算は出来できません。

ただし、「AND条件」であれば、下記のようにIF文を並べることで記述することができます。


IF %A% == 1 IF %B% == 2 (
    REM 1かつ2のAND条件です。
) ELSE (
    REM それ以外です。
)

WindowsバッチファイルのFOR文(ループ処理)

FORの基本書式

FORコマンドでループ処理を実現できます。

FOR文の基本書式は、1行に書く形式とブロック形式の構文が利用できます。

なお、FOR文における変数の指定方法は、コマンドラインで実行する場合は「%変数」、バッチファイルで実行する場合は「%%変数」となります。


FOR [オプション] %%変数 IN (セット) DO コマンド [変数]

FOR [オプション] %%変数 IN (セット) DO (
    コマンド [変数]
)

各パラメータには以下を指定します。

指定 説明
オプション オプションには「/d」「/r」「/l」「/f」の4つがあり、コマンド拡張機能が有効であるときに指定可能です。
%%変数 「a〜z」または「A〜Z」までの任意の1文字が利用でき、大文字と小文字は区別されます。
(セット) 複数のファイル、ディレクトリ、文字列、値などのファイルセットを指定します。ワイルドカードも使用可能。
コマンド 各ファイルごとに実行するコマンドを指定します。

FOR文は三つに区切ると判りやすくなります。

指定 説明
FOR %%変数 子の変数の中に処理対象がある場合には、処理を繰り返しなさいという意味の命令文です。
IN (セット) コマンドに渡したい処理対象(変数)を指定します。
DO コマンド 変数 変数(処理対象)を用いて、コマンドを実行します。

FOR文のオプション

指定 説明
/d 検索対象がファイルではなくディレクトリになります。また、セットにワイルドカードが使われている場合もディレクトリ名のみにマッチされます。
/r [ドライブ名:[パス名]] カレントディレクトリもしくは[ドライブ名]:[パス名]で指定したディレクトリ以下の階層に対してもforコマンドを実行します。(再帰的処理)
/l セットに範囲を指定できます。「開始値、増分、終了値」を指定した反復ステップ処理を実行します。
/f [解析文字列] セットの文字列に「解析文字列」で指定した指定どおりにトークンを切り出して、doコマンドに引き渡して実行します。セットがテキストファイル名の場合、テキストファイルの各行に対して順に処理が行われます。

「/f」オプションの解析文字列 は以下の通りです。

指定 説明
EOL=行末文字 行末文字(1文字)を指定します。この文字以降は無視される
SKIP=n ファイルの先頭からn行を無視します。
DELIMS=区切り文字セット 区切り文字セットを指定します。デフォルトの区切り文字セットはスペースとタブとなります。
USEBACKQ バッククォート(`)で囲まれた文字列をコマンドとして実行します。
TOKENS=番号1,番号2,番号n コマンド側に渡す変数の部分を指定します。

FOR文は4つのオプションを指定することで、書式(構文)が微妙に変化します。


1. for /d %%変数 in (セット) do コマンド [コマンドパラメータ]
2. for /r [[ドライブ:]パス] %%変数 in (セット) do コマンド [コマンドパラメータ]
3. for /l %%変数 in (開始,ステップ,終了) do コマンド [コマンドパラメータ]
4. for /f ["オプション"] %%変数 in (ファイル セット) do コマンド [コマンドパラメータ]
5. for /f ["オプション"] %%変数 in ("文字列") do コマンド [コマンドパラメータ]
6. for /f ["オプション"] %%変数 in ('コマンド') do コマンド [コマンドパラメータ] 
7. for /f "usebackq" %%変数 in ('文字列') do コマンド [コマンドパラメータ]
8. for /f "usebackq" %%変数 in (`コマンド`) do コマンド [コマンドパラメータ] 

FOR例

指定セット分だけループ実行(プログラム言語における「for each」に相当)する処理となります。

コマンドは「windows unix linux mac」の文字列を出力します。


FOR %%i IN (windows unix linux mac) DO @ECHO %%i

数値のループ処理です。「1,2,3,4,5」を出力します。


FOR /L %%i IN (1,1,5) DO @ECHO %%i

指定ファイルを検索します。findコマンドに相当します。


for /R %%i in (%*) do echo %%i

コマンド実行時のディレクトリ配下の「.svn」ディレクトリを削除します。


for /R /D %%I in (*.svn) do RMDIR "%%I" /S /Q

現在の環境の環境変数名を列挙します。


FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

WindowsバッチファイルのWHILE文(条件付きループ処理)

コマンドプロンプトにWHILE文はありませんが、「GOTOコマンド」と条件式を組み合わせることで処理を実現できます。


@ECHO OFF
SET /A CNT=0
:LOOP

REM ここに処理本体を記述します。

IF "%CNT%"=="終了値" GOTO END
SET /A CNT+=1
GOTO LOOP
:END

Windowsバッチファイルのswitch文

Windowsバッチファイルではswitch文に相当する機能はありません。


関連ページ