お便りに応えて

コメント*1にはコメントでと思いましたが、本文のネタが無いので本文でお返事します。

>バッチコマンドスクリプトで個人用ツールをちょくちょく組んでいるものです。長いものだと 2000行近くなることもあります。

これには驚きました。BATにそのレベルのものを記述するだけの言語能力があるとは思ってませんでした。
「個人用ツール」とのことなので単純バッチの連続とかとは違うんですよね。
うーん。わたしも2000行レベルだと他の言語に逃げる気がします。vbscriptrubyか、あるいは bash on cygwin

>・for 文の do の後を () で括って長々と書くよりは、丸ごとサブルーチンにして call で引数渡しにした方が制約が少ないのではないでしょうか。(for の do ( ) の中で参照する変数に ( や ) が含まれているとおかしくなるとか)

通常の環境変数の置換は構文解析前なのでそうでしょうが、遅延環境変数の展開を有効にして、! !で置換すれば問題は起きないと思います。また、for制御変数の置換も構文解析後のようで、特殊文字が含まれても大丈夫そうです。

>・^ で継続行がかけるので、 set BLT= を何段かに分けているところは ^ を使った書き方の方がすっきりしませんでしょうか。

これは知りませんでした!!。どこにも書いてないと思ったら、CMD /?に、特殊文字一覧としてちょろっと登場してますね。
ちょっと使ってみましたが、奇数個の"のあとでは継続の機能を失ってしまいます。ということは、" "に囲まれた文字列を継続行で長く伸ばすことは出来ないようです。どんなところに書けるかは研究の余地ありと思います。どっかに書いてあるかな。
キーワードであるififの間で^によって行を分けられるとは思いませんでしたが出来ますね

>・PATH環境変数の探索は %~$PATH:x% などの形式でコマンドにまかせてはだめでしょうか。

これはだめです。要求仕様が
for PATHEXTのそれぞれについて
  for PATHのそれぞれを調べる
なら、2番目のfor文を%~$PATH:x%を使って置き換えることは出来ますが、これだと、CMD.EXEの仕様に合わない。
for PATHのそれぞれについて
  for PATHEXTのそれぞれを調べる
というのがコマンド探索の仕様です。この場合は、%~$PATH:x%の出る幕はない。


>・未定義の環境変数に対する %xxx:yyy=zzz% 形式の参照は、そのまま全体が返るのではないでしょうか。構文エラーになりますか?

そう思うんですけどね。おかしい。コマンドライン直接なら確かにそうなる。でもファイルの中に
set _=
if defined _ if not "%_%" == "%_: =%" set _="%_%"
と書いて実行すると、
コマンドの構文が誤っています。
if defined _ if not "" == " =_"

って表示される。これは、どうも次回の宿題か?

>・cygwin を入れていると、 which がそのまま使えて便利です(しかし cygwin のパスで表示されますが)。

win95時代はcygwinを入れてましたが、Win環境との親和性が悪いのが気になってました。W2K以降、コマンドプロンプトのコマンド機能が十分になり、不十分とはいえ、ヒストリ、アリアス、コンプリーションも使えるので bash の魅力も薄れ、BorlandからフリーのCコンパイラが出、gccの魅力も薄れ現在はcygwinは入れなくなってしまいました。
とはいえ、現在unix由来のソフトとして meadowruby(mswin32版)、gawk、less、ack、nkf なんかは良く使ってますね。

*1:オリジナルサイトでのコメントの話なのでこのサイトではコメントは付いてない