@echo off
setlocal enabledelayedexpansion
for /l %%I in (1,1,100) do (
set /a mod3=%%I%%3
set /a mod5=%%I%%5
set /a mod15=%%I%%15
if !mod15!==0 (
echo FizzBuzz
) else if !mod3!==0 (
echo Fizz
) else if !mod5!==0 (
echo Buzz
) else (
echo %%I
)
)
pause
#おまじない
Windowsバッチはデフォルトで実行したコマンド自身を全て出力する。
echo off は以降実行したコマンド自身を出力しないように設定する。
しかし echo off というコマンド自身は出力される。
これを回避するため、先頭に @ を付与する。
コマンドの先頭に @ を付与した場合、そのコマンド自身は出力されなくなる。
先頭に @echo off と書いて以降のコマンド自身を出力されなくするのはWindowsバッチによく見られるお約束のパターン。
#for コマンドによるループ処理
for /l %%I in (1,1,N) do *
%%I に 1 ~ N を +1 ずつ変化させて割り当て、* を実行する。
丸括弧で囲むことで、複数行のコマンドを対象にループを行うことができる。
#set コマンドによる環境変数の設定
set a/ [環境変数名]=設定される式
単純な文字列リテラルを設定する場合は /a は不要。
バッチスクリプト内にて単一の % は環境変数の展開として作用するため、% という文字そのものを表現したい場合、 %% と2連続させる。
#if コマンドによる処理分岐
if コマンドの判定式の中で加減乗除等の計算を行うことはできないため、set /a によって環境変数に計算結果を設定して、その環境変数を if コマンドの判定式として使用する。
if コマンドの丸括弧の終了と else コマンドの丸括弧の開始は同じ行に記述されていなければいけないことに注意。
#環境変数の遅延展開
setlocal enabledelayedexpansion
環境変数の展開を遅延させるために必要。
これがない場合、for コマンドを実行する際にループ内処理の環境変数の展開が行われる。
環境変数 mod3, mod5, mod15 には for コマンド実行時点では値が設定されていないため、if コマンドは以下のように展開される。
if ==0 (
echo FizzBuzz
) else if ==0 (
echo Fizz
) else if ==0 (
echo Buzz
)
(補足)値が設定されていない環境変数を展開すると、空文字列となる。
setlocal enabledelayedexpansion は感嘆符 ! によって囲まれた環境変数をコマンドの実行時まで遅延して展開するように設定する。
すなわち、各ループ毎に計算された mod3, mod5, mod15 の値を判定に使うことができるようになる。