概要
Windowsのbatchファイルで、数字をゼロ埋めして2桁にそろえるような処理を考えました。
ですが、ビックリマークで囲んだ変数の特性と、%で囲んだ変数の特性の違いを考えなかったため、思っていた結果が得られませんでした。
ゼロ埋め処理でハマった点について、本記事では書きたいと思います。
何が発生したのか
事象
次のように、1から3までをforで回し、画面に出力するバッチファイルがあります。
@echo off
for /L %%i in (1,1,3) do (
echo %%i
)
このスクリプトを修正し、出力結果が01,02,03のようにゼロ埋めされるようにしました。
@echo off
for /L %%i in (1,1,3) do (
set "num=00%%i"
set num=!num:~-2!
echo !num!
)
すると出力結果は
C:\work\temp>number.bat
!num!
!num!
!num!
と!num!がそのまま出力されてしまいました。
原因
ビックリマークで囲んだ変数については、setlocal enabledelayedexpansion
を使用し、遅延展開を有効化する必要がありました。
具体的にはスクリプトを以下のように修正します。
@echo off
setlocal enabledelayedexpansion
for /L %%i in (1,1,3) do (
set "num=00%%i"
set num=!num:~-2!
echo !num!
)
これで出力結果は
C:\work\temp>number.bat
01
02
03
と無事ゼロ埋めされた結果を得ることができました。
どういうこと?
- %で囲まれた変数は静的変数として、コマンドが実行される前に値が評価される
- !で囲まれた変数は動的変数として、コマンドが実行される直前に値が評価される
後者の場合、setlocal enabledelayedexpansion
が有効でないと値が読み込まれないようです。
for文を使用し、値が何度も変わるようなケースでは後者を使うのがよさそうです。
参考