- blogs:
- cles::blog

bat を遅延環境変数を使わないように書き換える

Windows の bat には遅延環境変数というハマりやすい機能があります。
bat では環境変数はその行に入ったときに即時に展開されるという性質があり、IF や FOR などの括弧内は1行と見なされるので、特に FOR ループの中で環境変数を変更しようとしたりすると、うまく変数が更新されないということが起きたりします。これを解決するために用意されているのが遅延環境変数(enabledelayedexpansion)です。
例えば複数のファイルを bat ファイルにドラッグアンドドロップして、そのファイルを1つずつ処理したいという場合には for を使って以下のように書くことができますが、enabledelayedexpansion を書き忘れたりとか変数の展開に % と ! の使い分けが必要だったりとか、いろいろと面倒です。
例えばこの bat に3つのファイル(AAA.txt, AAA2.txt, AAA3.txt)をドラッグアンドドロップすると以下のようになります。
(パス内の AAA を BBB に置換して出力)
これを enabledelayedexpansion を使わないで書き直せないかと思って試行錯誤してみたところ、サブルーチンを使うと上手く書けることがわかりました。例えば先ほどの処理と同じものは以下のように書けます。サブルーチンは for の行内とはみなされないので、enabledelayedexpansion がなくてもちゃんと変数展開されます。
毎回ハマっている気がするので、今度からはこれをひな形にすることにしましょうかね。
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/11244
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110778)
3 . 年次の人間ドックへ(110372)
4 . 2023 年分の確定申告完了!(1つめ)(109918)
5 . 三菱鉛筆がラミーを買収(109819)