このforステートメントを応用すると、一定のパターンを満たすファイル名を変更するなどといった作業が行える。例えば、“PP”で始まるJPEGファイルをXXX-PP*-YYY.JPGといったパターンに変更する場合、
for %%V in ( PP*.JPG ) do ren %V XXX-%~nV-YYY%~xV
とすればよい。ren(rename)コマンドでもファイル名の一括変換は可能だが、このようなファイル名の長さが変わるような名前変更は不可能である。renコマンドで可能なのは、例えばXX*.JPGをYY*.JPGにすることは可能だが(“*”の部分にマッチする名前の長さや位置は変更の前後で変えることはできない)、より複雑なパターンの名前変更を行うには、上のようなforステートメントや、より高度な変数の編集・置換機能(今後解説する予定)が必要となる。
なお、ここで注意すべき点は、セット部分には、対象となるパターンだけを確実に指定しておかないと、forステートメントが誤動作する可能性があるということだ(バグなのか仕様なのかはやや怪しいが)。
例えば上記のステートメントを
for %%V in ( *.JPG ) do ren %%V XXX-%%~nV-YYY%%~xV
として実行すると(forコマンドのセットには“*.JPG”と指定していることに注意)、最初の1つのファイルだけは、2回renコマンドが適用されてしまう。具体的には、以下のスクリプトを実行する。
@echo off
dir
echo ---------------Execute CMD--------------------
for %%V in ( *.JPG ) do ren %%V XXX-%%~nV-YYY%%~xV
dir
その結果は以下のように、「PP0001.JPG」が2回名前変更されてしまって、結果がおかしくなっている。renコマンドによる変更後のファイルも、forコマンドのセットにマッチしてしまったのがそもそもの原因のようである。
C:\cmd\forcommand\testdir\t2>..\testrename.cmd
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は A024-5237 です
C:\cmd\forcommand\testdir\t2 のディレクトリ
2001/04/23 14:18 <DIR> .
2001/04/23 14:18 <DIR> ..
2001/04/23 13:57 0 PP0001.JPG
2001/04/23 13:57 0 PP0002.JPG
2001/04/23 13:57 0 PP0003.JPG
2001/04/23 13:57 0 PP0004.JPG
4 個のファイル 0 バイト
2 個のディレクトリ 21,792,612,352 バイトの空き領域
---------------Execute CMD--------------------
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は A024-5237 です
C:\cmd\forcommand\testdir\t2 のディレクトリ
2001/04/23 14:18 <DIR> .
2001/04/23 14:18 <DIR> ..
2001/04/23 13:57 0 XXX-PP0002-YYY.JPG
2001/04/23 13:57 0 XXX-PP0003-YYY.JPG
2001/04/23 13:57 0 XXX-PP0004-YYY.JPG
2001/04/23 13:57 0 XXX-XXX-PP0001-YYY-YYY.JPG
4 個のファイル 0 バイト
2 個のディレクトリ 21,792,612,352 バイトの空き領域
実際筆者は他の条件下で、セットに“*.*”を指定したときに、無限ループに陥ったこともあった。このためセットを指定する場合には、確実に「処理対象となるファイルだけ(処理前のファイルにのみ一致するようなパターン)」を指定するようにするべきだろう。
さて、次回は、拡張されたforステートメント自体の機能について解説を行う。
Copyright© Digital Advantage Corp. All Rights Reserved.