バッチファイルを用いて数値を扱う際に「1」ではなくて「00001」というように、任意の桁を0で埋めた数値を扱いたい場合があります。
よくあるケースとしては、大量の連番画像(「00001.jpg」「00002.jpg」「00003.jpg」)のファイル名を一斉に変更するために、ファイル名を示す文字列をFor文で作成する場合です。
今回は、任意の桁を0で埋めた数値をバッチファイルで扱う方法について確認したいと思います。
まずは具体的なコマンドを先に紹介し、その後にコマンドの中身を解説していきたいと思います。
以下のコードは1~1000の数値に関して、4桁になるよう空いている桁を0で埋めた数値をコンソールに表示するコマンドです。
想定する出力結果としては下記のように、
0001, 0002, 0003, ……. , 0010, 0011, …… , 0100, 0101, …… , 1000
と4桁のうち、数値が存在しない桁は0で埋めた数値(文字列)が自動生成されます。
上記コマンドの実行結果は以下の通りです。
それでは、上記のコマンドのポイントについて紐解いて行きたいと思います。
今回の0埋めを実現するにあたってポイントとなる箇所はまず以下です。
まず、「set num=000%%a」は、numという変数に「000%%a」を代入することを意味しています。今回は最終的な結果を4桁にしたいので、4より1少ない3個の0を「%%a」の前につけます。理由は後で説明します。
とにかく、ここでは「出力したい桁数 – 1」の数の「0」を、ループ変数の前に付けてください。
「%%a」はFor文のループ変数で1~1000の値がループごとに入ります。
すなわち、「set num=000%%a」の時点では、numに入る値は「%%a=1」であれば「0001」であり、「%%a=1000」であれば「0001000」です。
次に、「set num=!num:~-4,4!」について見ていきます。「4」の部分には、出力したい桁数を入力してください。
ここで「num:~-4,4」は何を表すでしょうか。これは後半の4桁のみを残すことができるコマンドです。つまり、「0001」であれば「0001」のままですが、「0001000」であれば「1000」になります。
最後に、変数をエクスクラメーションマークで囲むことで、当該変数の値にアクセスすることができます。「set num = !num:~-4,4!」とすることで、numという変数を、numから後半4桁のみを残した数値で上書きすることができます。
最後に、今回は実現にあたり遅延環境変数というものを用いました。以下の箇所です。
実は、これを入れないと今回の機能は上手く働きません。
実はバッチファイルはその仕様上、変数の値の展開はFor文の入り口に到達した時点で行われます。すなわち、For文内で値を変更しても、上手く変更が成されません。
これを避けるための仕組みが環境変数の遅延展開で、通常は「%変数名%」とする変数の指定を「!変数名!」とし、当該箇所を「setlocal enabledelayedexpansion」~「endlocal」とすることで、実際にその処理をするときに変数の値を置き換えることができるようになります。
つまり、遅延展開を行うことで、バッチファイルで使う変数を、コードを読み込む時ではなく、実際にその処理を実行するときに値と置き換えることができるようになります。
ざっくりと、For文の中で変数を弄りたいときには、このような呪文が必要なんだと覚えておいてください。
今回はWindowsのバッチファイルで、任意の桁を0埋めする方法を紹介しました。
連番のファイルなどは0埋めされたファイル名が付けられていることが多く、このようなファイルを扱う場合には、今回紹介した工夫を行う必要があります。