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文に相当する機能はありません。
関連ページ
- Windowsバッチファイル - 作成と実行
- Windowsバッチファイル - 引数
- Windowsバッチファイル - 特殊な文法
- Windowsバッチファイル - 変数
- Windowsバッチファイル - 演算子
- Windowsバッチファイル - 制御構文
- Windowsバッチファイル - 外部ファイルの読み書き
- Windowsバッチファイル - 実行結果の取得