まず、環境変数とは何か・・・っていうと、
前にも出てきてるけど、%systemroot% とか %path% とか、
システムの動作に必要なものを定義した変数なんだ。
マイコンピュータ を右クリックで 「プロパティ」 を
ポイントしてみよう。そして 「詳細タブ」。
その画面にある 「環境変数ボタン」 を押下してください。
起動したウィンドウの中で見られるのが、システム起動時に
定義される環境変数だ。%systemroot% 、 %path% も見つかるよね。
ここで新規に環境変数を作成すると、起動時に設定されるようになる。
編集、削除も可能だが、システムの動作に深く関わるので
充分な理解が出来るまでは、あまりお勧めできない。
バッチファイルを作成するにあたっては、特に必要ないとも言える。
set コマンドを使用して、局所的な変数を設定できるからだ。
ただし、ここにある変数と重ねると大変なことになる場合がある。
Windows 2000, XP での コマンドプロンプト では、
さほどの問題にならないようだが、MS-DOS プロンプト では
当方に既にその環境が無いために確認が出来ていない。
極端な例だが、 set path=
などとやってしまうと、再起動を余儀なくされることも予想されるので
重複を避けておいた方が無難である。
では、前回同様に、「+Lhaca でサブホルダ毎に一括圧縮」 の
ソースを例としてみてみよう。
set LHACA_PATH="C:¥Program Files¥Lhaca¥Lhaca.exe"
set TEMP_FILE=dircomp.$$$
set LOG_FILE_NAME=%~dp0SubDirLhaca.log
set IS_DIRECTORY=NULL
この4個の環境変数が使用されている。
LHACA_PATH は、+Lhaca の実行ファイルの完全パス、
TEMP_FILE は、サブホルダ一覧を保存する一時ファイル名、
LOG_FILE_NAME は、実行履歴を保存しておくファイル名、
IS_DIRECTORY は、与えられた引数がホルダか否かを
判定するための変数
として使用されている。set コマンドは、
指定された変数名に値を代入するのに使用されている。
格納された値を呼び出すには、% で挟んでやれば良い。
%TEMP_FILE% とすれば、これをそのまま dircomp.$$$ に
置き換えてくれる。
変数の指定時には、% を付加してはならない。また、
代入される値は、= のすぐ右側から行末まで全てであり、
見やすいからと言ってスペースを空けたりすると、先頭にスペースを持った文字列になるので、気を付けなければならない。
もちろん、2重引用符もそのまま格納される。この場合、
"%LHACA_PATH%" とすると、2重引用符が2個連続する
事になる。見つけにくいバグになるので、
これにも充分気をつけたい。
LOG_FILE_NAME には、変数を使って値を設定している。
%~dp0 は、「%0 の引数をドライブとパス名に展開せよ」 という意味だ。
help for を実行すると、参照変数の置換について記されている。
いろいろ試してみると面白い。
そして、%~dp0 の実行結果の末尾が、¥ になることを
確認しておこう。そうすれば、%~dp0SubDirLhaca.log は、
%~dp0 の部分が展開された結果、完全パスに
なっていることが解かるだろう。
IS_DIRECTORY では、最初に NULL という値を格納している。
しかし、次の for 文でホルダか否かをチェックしている。
%1 に格納された文字列をホルダと仮定して、その親ホルダ内の
サブホルダを全てチェックし、一致するものが見つかったら
IS_DIRECTORY にそのときの変数名を代入している。
つまり、ホルダではなかった場合には、IS_DIRECTORY は
NULL のままだ。そこで、次の文で条件分岐、
「%IS_DIRECTORY% が NULL と同じだったら
jump ラベルに飛べ」
と言う命令で処理をスキップしている。
っと、チョッと語調を変えて書いてみたけど、どうだろう?
どっちが読みやすいのかなぁ〜?
えっ? 一緒? どっちも解かんな〜〜い って??
うぅ〜〜、面目ない・・・
なんか、順番が滅茶苦茶になっているけど、
次回は、条件分岐、ループ処理 あたり、もうチョッと詳しく話そう。
応援ポチ お願いしま〜す。

%~dp0SubDirLhaca.logの展開は
『c:\Documents and Settings\Shiggy\dp0SubDirLhaca.log』
とはならないで、下記となります。
『c:\ and Settings\Shiggy\dp0SubDirLhaca.log』
注)バッチプログラムを『c:\』で実行時は、問題ありません
Q1:解決方法は?