バッチファイルで配列相当のことをしようとしたら難しかった
はじめに
訳あってバッチファイルで配列相当のことをしようとしたら、いろいろはまったのでメモ。
(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でも使おうかと思います。
無理矢理なので、不自然な書き方になりますし、動かなかった場合の原因究明が面倒なので。