« フォルダの表示モードを切り替える。 | トップページ | バッチファイルだけで、UnicodeLE や UTF-8 の BOM を除去する。 »

2009年5月15日 (金)

forコマンドの憂鬱。ファイルセットのリカージョン

例えば、ファイル名の先頭に文字列を付加しようと、

for %%I in (*.txt) do rename "%%I" "hoge_%%I"

なんてやると、リカージョンを起こします。hoge_hoge_aaa.txt みたいに。

この問題を避けるために、

for /f "delims=" %%I in ('dir /b *.txt') do rename "%%I" "hoge_%%I"

なんてやると、今度は、非シフトJIS文字を含むファイル名が扱えなくなります。

まぁ、そういうケースはあまりないと思いますが。。。

そこで、ファイルセットをいったん環境変数に溜めて、そこから再び取り出します。

setlocal enabledelayedexpansion
set LF=^

set BUF=
for %%I in (*.txt) do set BUF=!BUF!!LF!%%I
for /f "delims=" %%I in ("!BUF!") do rename "%%I" "hoge_%%I"

遅延展開でLF文字を使って結合すると、「複数行の文字列」が作れます。
for /f in ("文字列")を使うと、「複数行の文字列」から1行ずつ順次取り出せます。

« フォルダの表示モードを切り替える。 | トップページ | バッチファイルだけで、UnicodeLE や UTF-8 の BOM を除去する。 »