変数へ値を代入するには、set コマンドを使用します。
変数を使用するには、変数を「%」、「!」で挟んで使用します。
遅延環境変数の設定を使用する場合は、「!」を使用することになります。
遅延環境変数を使用する場合以下の構文を先に記述します。
setlocal enabledelayedexpansion
コマンドプロンプトのバッチファイル処理では、コマンドが処理される際、先に変数が代入値に変換されてから処理されます。
また、if文、for文のように入れ子になっている場合、入れ子部分も含めて1コマンドという扱いとなり、入れ子内の全ての変数が代入値に置き換わってから処理されてしまいます。
そのため、入れ子内の処理で変数内の値が変化してもそれが反映されずに処理されてしまいます。
これは、他のプログラミング言語とは違う挙動です。
しかし、処理内容によっては、入れ子内での処理で変数の値が変化した後にコマンドを処理したい場合があります。
その場合にこの遅延環境変数の設定を行い、変数を「!」で囲むことで直前まで変換されないようにできます。
例
@echo off
setlocal enabledelayedexpansion
set a=1
set b=2
set /a c=%a%+%b%
set d=%a%+%b%
echo c=%c%
echo d=%d%
for %%i in (0,1,5) do (
set /a a=%a%+1
set /a b=!b!+1
echo a=%a% a'=!a!
echo b=%b% b'=!b!
)
結果
c=3
d=1+2
a=1 a'=2
b=2 b'=3
a=1 a'=2
b=2 b'=4
a=1 a'=2
b=2 b'=5
数値演算の場合でも変数への代入処理となるのでset コマンドを使わなければなりません。
数値演算の場合 /a のオプションをつけて明示します。
set a=1
echo %a%
set /a a+=1
echo %a%
set /a a = %a%+1
echo %a%
結果
1
2
3
文字と文字を結合させるにも set コマンドを使用します。
文字を代入した変数どうしを繋げて記述すれば、文字を結合できます。
set a=私は
set b=太郎です
set c=%a%%b%
echo %c%
結果
私は太郎です
それは、空白です
下は、私はの後に空白が入ってしまっています。
set a=私は
set b=太郎です
set c=%a%%b%
echo %c%
結果
私は 太郎です
式をダブルコーテーションで囲んで文字列の最後を明示するとよいです
set "a=私は"
set "b=太郎です"
set "c=%a%%b%"
echo %c%
日付を扱うと数値の前に0(ゼロ)があったりします。例えば1月であれば、01のようになっています。
コマンドプロンプトのバッチファイル処理では、数値の前に0があると8進数として認識され、set /a で計算すると10進数計算ができません。その場合にsetの文字と数値の認識をうまく利用して計算します。
REM \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
REM 月データから0を削除
REM \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
REM 0で始まる数値は8進数と認識されるため以下の計算を用いて0を除去する
REM 1を追加し2倍にする。そこから2を追加した値を引いて抽出
set "MONTH=06"
echo %MONTH%
set /a "MONTH=1%MONTH%*2-2%MONTH%"
echo %MONTH%
結果
06
6