以前、バッチファイルを作成したこと時のソースの一部を利用して書き方の説明を備忘録を兼ねて記載します。
作成したバッチファイルの詳細や説明、基本的な書き方は、以下をご覧ください。
使用している構文やコマンド
setlocal enabledelayedexpansion
繰り返し処理を説明する前に覚えておいて欲しいことがあります。「バッチファイルとは」にも少し触れましたが、バッチファイルは、バッチファイルの内容を一度全て読み取り、1行目から実行していく特徴があります。そのため、変数を用いた繰り返し処理を記載する際は注意が必要です。変数の値を処理の中で変化させていくには、遅延展開が必要です。そのために用いるのがこの構文になります。また、変化させる変数を通過した後は必ず「endlocal」で閉じるようにしましょう。
setlocal enabledelayedexpansion
~~ 処理内容 ~~
endlocal
変数の値を参照する際は注意が必要です。通常の「%変数名%」では参照できないため、「!変数名!」とする必要があります。
しかし、この「setlocal enabledelayedexpansion」には予期せぬ障害を生む可能性があります。それは「!変数名!」と「%変数名%」の考慮不足、「setlocal enabledelayedexpansion」を入れる場所の考慮不足によるものも多いです。また「!」を含む値を用いることもできなくなる場合があります。そのため、「setlocal enabledelayedexpansion」で囲む範囲は必要最小限に留めることをお勧めします。
for文(繰り返し処理)
繰り返し処理は、for文を使用します。構文は以下です。
for /l %%アルファベット1文字の変数
in ([開始する数],[増加させる数],[終了する数]) do ( 行う処理 )
「/l」はオプションとなります。他のプログラミング言語と同じようにfor文を使用するには、上記の構文のように「/l」を使用してください。
他にも一例として以下のようなものがありますが、詳細は省きます。
オプションなし(in の後はファイル名) | ファイルを対象にした繰り返し処理 |
/d(in の後はフォルダ名) | フォルダを対象にした繰り返し処理 |
/f(in の後はファイル名) | ファイルの内容を1行ずつ読み取る繰り返し処理 |
/r ディレクトリパス(in の後はファイル名) | ディレクトリパスに指定したフォルダのサブディレクトリまでを対象にした繰り返し処理 |
記載例を以下に示します。実行結果は1~3を表示します。
setlocal enabledelayedexpansion
for /l %%i in (1,1,3) do (
set num=000%%i
echo !num!
)endlocal
if文(条件分岐)
条件分岐では、他の言語と同様に「if/else if/else」を使用します。構文は以下です。
if 条件式① (
~~条件式①が真だった時の処理~~
) else if 条件式② (
~~条件式②が真だった時の処理~~
) else (
~~その他の処理~~
)
以下の例では、日付に対して3パターンの処理に分岐させています。
if “!fin_date!”==”” (
~~最終日が空欄だった時の処理~~
) else if !fin_date! LSS !start_date! (
~~最終日が開始日より早かった時の処理~~
) else (
~~その他の処理~~
)
また、以下のように一文で記載することも可能です。
if 条件式 条件式が真だった時の処理
※バッチファイルで条件分岐の時に使用可能な演算子は、以下のようなものがあります。
比較演算子
※文字列比較の場合 「if /i 条件文 (処理)」のように「/i」をいれると大文字小文字を区別せずに比較されるようになります。
A == B | AとBは等しい ※文字列が両方とも数字でも文字列の比較になる |
not A == B | AとBは等しくない |
A EQU B | AとBは等しい ※文字列が両方とも数字の時は数値の比較になる |
A NEQ B | AとBは等しくない |
A LSS B | Aは、Bより小さい |
A GTR B | Aは、Bより大きい |
A LEQ B | Aは、B以下 |
A GEQ B | Aは、B以上 |
exist A | Aが存在する ※ファイルやフォルダを対象にする |
not exist A | Aが存在しない ※ファイルやフォルダを対象にする |
まとめ
今回は、バッチファイル作成時の繰り返し処理、条件分岐についてまとめました。よく使われる構文だと思うので、参考にしてみて下さい。