- blogs:
- cles::blog
bat を遅延環境変数を使わないように書き換える
batWindows の 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 を使ってログインすることができます。
- シャープの空気清浄加湿器の... (1)
- SMARTEK デジタル温湿度計 (1)
2 . Word で数式がグレーアウトされていて挿入できないときは(15164)
3 . awk で指定した n カラム目以降を出力する(11759)
4 . アーロンチェアのポスチャーフィットを修理(11455)
5 . Windows 10 で勝手にログアウトされないようにする(9738)