Chapter 21

バッチへの引数から消えるイコール・セミコロン

zetamatta
zetamatta
2021.05.22に更新

バッチファイルのパラメータでは =; が空白と等価に扱われてしまうという問題があります。

$ type foo.cmd
@echo off
echo *=[%*]
echo 1=[%1]
echo 2=[%2]
echo 3=[%3]
echo 4=[%4]

$ foo A=B "C=D"
*=[A=B "C=D"]
1=[A]
2=[B]
3=["C=D"]
4=[]

おおかたは互換性のためだと思われますが、結論から言うと

  • 二重引用符の中の = ではパラメータは分割されない
  • %* 内では = が消えることはない

ようです。対策としては呼び出し時に二重引用符で囲んでもらうのが一番てっとり早いようです。
for /F で %* を分割すればよいかとも思われましたが

  • for /F のデフォルトの区切り文字にもイコールが入っている
  • for の区切り文字を空白だけにするにも for のオプションの区切り自体がそもそも空白なので指定できない
  • %* 中のイコールを別の文字に置換するにも %VAR:x=y% の x にイコールを設定できない

など、簡単にはいかないようです。

外部コマンド(たとえば awk)が利用できるのであれば

$ type bar.cmd
@echo off

echo %* | gawk "{ print $1 ; print $2 }"

$ bar A=B "C=D"
A=B
"C=D"

などと回避もできるのですが…うまくゆかないものです。