リストファイルを1行ずつ読み込み(バッチ)

 日頃のPCのバックアップを行う場合、対象ファイルをバックアップしておく事になるが運用していくにつれバックアップ対象のファイルが増えたり減ったりすることがある。
逆に週次で対象ファイルを削除しなきゃいけない。なんて事もあるだろう。

 そんな場合、対象ファイルやディレクトリをソースとは別のリストファイルに1行ずつ記載しておき、その対象ファイルを読み込んで作業を行ってくれるバッチがあればソースの修正をする事無く対象ファイルの増減ができる。

リストファイルにあるパスを1行ずつ同じ処理を行う時は

for /f %%A in ([読み込むファイルパス]) do (
	行いたい処理
	  :
	  :
)

リストファイルは行いたい処理によって書くことが変わってくるでしょう。

では、例としてリストファイルにあるフォルダを削除していきたい場合を書いてみます。

for /f %%A in (delete_list.lst) do (
	rmdir /S /Q %%A
)

rmdirのオプションはこちらを参照

リストファイルには削除したいフォルダを羅列していきます。

C:\Users\user_name\Favorites\temp_folder\
C:\Users\user_name\Documents\temp_folder\

簡単に解説すると
11行目:「in」の括弧内にあるファイルをリストファイルとして、リストファイルの21行目を読み込んで「%%A」という変数に代入。
12行目:rmdirコマンドをリストファイルの行数分繰り返す。

問題発生!

 リストファイル内でスペースが入っていると初めのスペースまでの文字列を対象とする事が判明。
どういう事かというと
例えばリストファイルに「C:\Program Files\pretest\」というフォルダを削除対象にする為に記載すると
バッチ上では「C:¥Program」を削除しようとする。いわゆるスペースが入っていると(全角スペースでも一緒でした)スペース以降の文字列は無視されてしまうのだ。
これはシャレにならん。もしCドライブ内にProgramというフォルダがあったら意図しないフォルダを消してしまうのだ!!

スペースが入っていても1行全体を読み込む方法がありました。 2021/9/10追加

もしかしたら何か解決方法があるのかもしれない。
が、こんな時はもうめんどくさいのでPowerShellを使って削除しましょう。
そうした方がなぜかバッチでは削除できないことが発生しても、PowerShellでは強力に削除が実行出来たりもするのでね。

スペースが入っていても1行すべて読み込む方法

 やっぱりスペースが入っていても1行をすべて読み込む方法がありました。
オプションの後に「"delims="」を入れると読み込むテキストにスペースが入っていても区切らずに読み込んでくれます。

for /f "delims=" %%A in ([読み込みたいテキストファイルのパス]) do (
	行いたい処理
	  :
	  :
)