バッチファイルの勉強

今までDOSの勉強なんてほとんどしてなくて全然分からんけど挑戦した。やってみて、きちんと勉強すればDOSも意外に仕える存在かもしれないと認識を改める事が出来た事が何よりの収穫。

help command

ヘルプは充実していて良い感じ

  • ネットで調べるよりhelpコマンドを見たほうが充実している
  • サンプルも載っているので理解しやすい

FORコマンド

  • バッチファイルで使用する時は変数%変数%%変数としないといけない
  • 変数がファイルパスの場合、%~f変数でフルパスを得る事が出来る

setコマンド

help setの方にFORコマンド中にsetを使用するときの注意点が載っている

set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
この例では、現在のディレクトリのファイルの一覧は作成されず、代わりに最後に見つけられたファイルが LIST 変数に設定されます。これは %LIST% が FOR 文が読み取られるとき、一度だけ展開され、そのときは LIST 変数は、空だからです。つまり、実際に実行されている FOR ループは
for %i in (*) do set LIST= %i
で、LIST に最後にみつけられたファイルを設定し続けているだけです。 遅延環境変数の展開では、実行時に環境変数を展開するために異なった文字(感嘆符)を使うことができます。遅延環境変数の展開が有効な場合、上記の例は次のように書くと意図したように動作します。
rem (略)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%

setlocalコマンド

これバッチファイルを書く時には重要と思われる。バッチファイル中で遅延環境変数の展開のon,offを設定する事が出来るのだSETLOCAL ENABLEDELAYEDEXPANSIONとすることで遅延環境変数の展開を on にする事ができ、help setに載っていたFORコマンド中のデータ追加が可能となる。
因みにコマンドプロンプト中で遅延環境変数の展開を on にするにはcmd /v:onとすれば良い。詳しくはhelp cmdで。デフォルトでonにしておく設定方法も載っているので見て損は無いかと。

まとめ

まとめるとバッチファイル中で空白区切りのフルパスのファイルリストを得るには

setlocal ENABLEDELAYEDEXPANSION
set FILE_LIST=
for %%i in (*) do set FILE_LIST=!FILE_LIST! %%i

とすれば良い。

*1:"ヤン"は私の旧ハンドルネーム。こちらでは使い続けている。