0
0

batchファイルでゼロ埋めをする時に遅延展開でハマった

Posted at

概要

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文を使用し、値が何度も変わるようなケースでは後者を使うのがよさそうです。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0