バッチファイルで配列相当のことをしようとしたら難しかった

はじめに

 訳あってバッチファイルで配列相当のことをしようとしたら、いろいろはまったのでメモ。
 (2011/02/11 コメントで指摘をいただきました。いろいろ勘違いしてましたので、勘違いに基づく記述について、取消線でけしました。)

環境

参考になるサイト

 例によって先人が居まして、参考になるサイトが存在します。

苦労した点

 上記のサイトをみながらやったのですが、意外と苦労しましたので、何に苦労したかメモ。
 ただまあ、あまり丁寧に検証できなかったので、書いてることはややオカルトかもしれません。

setlocal ENABLEDELAYEDEXPANSIONは使った方が無難

 forを使うときに、「setlocal ENABLEDELAYEDEXPANSION」使わないとなぜか動かないことがあるような。
 「setlocal ENABLEDELAYEDEXPANSION」を使うことを個人的には推奨。

setlocal ENABLEDELAYEDEXPANSION はバッチファイルの最初の方に書く必要がある。

 先頭じゃなくても機能するのですが、あんまり下に書くとエラーが出るみたいです。「setlocal ENABLEDELAYEDEXPANSION」より前に書いてはいけないコマンドがあると思われるのですが、謎。

setlocal ENABLEDELAYEDEXPANSIONが適切に機能しないシチュエーションがある?

 「setlocal ENABLEDELAYEDEXPANSION」を使っているにもかかわらず、「call コマンド名 %%x[%i%]%%」と書かないと駄目なことがあるような…。
 echo以外はこう書かないと駄目なのか? いや、私の勘違いかもしれませんが。

なんだかforとifの相性が悪い

 forの中にifを書いたら、ifの条件のところで、うまく変数を展開できないことがありました。
 forの中でifを使いたい場合は、ifの部分を別のバッチファイルに追い出した方が簡単かも。

遅延展開についての別解

 あとで気づいたので、私は使わなかったのですが、遅延展開については「setlocal ENABLEDELAYEDEXPANSION 」を使う以外に「% のかわりに ! で囲まれた環境変数名」を使用するという方法もあるそうです。

その他参考

複雑なバッチファイルを書く際に使いそうなコマンドの解説が以下に存在します。

さいごに

 バッチで配列相当のことは実現可能ではあるのですが、次回から配列相当のものが必要だと分かった場合、VBScriptでも使おうかと思います。
 無理矢理なので、不自然な書き方になりますし、動かなかった場合の原因究明が面倒なので。