Windowsバッチの「それ引用符じゃないよ」って話

あと、Windowsバッチ(.BAT)の書き方で違和感があるのが、ダブルクォーテーションの扱いである。

エスケープしない限り、ダブルクォーテーションは文字としてそのまま使われることはなく、文字列の範囲指定、つまり引用符(ダブルクォーテーションで囲んだ中身が有効)として使われる・・・という認識なんだけど Windowsバッチでは違う。

例えば Perl で

my $a = "ABC";
if ("$a" eq "ABC") { print "ok!"; }

としたとき(まあ、変数をわざわざ "" で囲むことはないけど、例としてね)、比較されるのは $a変数に収められた ABC という文字列と、"" で囲まれた ABC という文字列である。決して、"ABC" と "ABC" が比較されるわけではない。
"" とすれば、それはダブルクォーテーションで囲まれた文字が何もない(空文字)ということになる。

ところが Windowsバッチで、

IF %1 == "ABC" ( ECHO 同じです ) ELSE ( ECHO 違います )

なんて書いて引数に ABC を指定して' test.bat ABC 'ってバッチを起動すると「違います」と言われる。「え?"ABC" と "ABC" なのに?」でも、実際は ABC と "ABC" の比較になってるのだ。
改めて、' test.bat "ABC" 'と実行すれば、これは「同じです」と返ってくる。ダブルクォーテーションも単なる文字として判断されているので、これなら "ABC" と "ABC" の比較となるからだ。

上記の IF 文で、引数に何も指定しなければ「"ABC" の使い方が誤っています。」というエラーになる。

この場合、%1 は「空文字」ではなく「無」な状態となり、変数展開後、

IF == "ABC" ( ECHO 同じです ) ELSE ( ECHO 違います )

と書いたのと同じことになるのだ。書式として誤った形になっている。なんか気持ち悪い(^^;;;

なので、正しい対応(あとで書くが、これは単なる慣習である)

IF "%1" == "ABC" ( ECHO 同じです ) ELSE ( ECHO 違います )

と書く。そうすると、引数が指定されなかったときは、

IF "" == "ABC" ( ECHO 同じです ) ELSE ( ECHO 違います )

と書いたのと同じになるので、書式として正しい。む~ん・・・

上の例は、まるで変数や文字列を二重引用符(ダブルクォーテーション)で囲ったように見えるが、これは実は引用符ではない。そもそも、Windowsバッチには引用符という概念がない。

これは実際には

IF X%1X == XABCX ( ECHO 同じです ) ELSE ( ECHO 違います )

のように、ダブルクオーテーションではなくても良い。%1 が「無」の状態とならなければいいのだ。だから囲ってやる必要もなく、

IF X%1 == XABC ( ECHO 同じです ) ELSE ( ECHO 違います )

でいい。%1が空だったときに、何かしらの値がそこに残ればいいのだ。上の例であれば、「IF X == XABC」となり書式としては成立している。そこを「頭に X を置くのでは見栄えも悪いし」ということで、慣習的にダブルクォーテーションで囲っているだけの話だ。

この辺が日ごろ Windowsバッチに触れてない人間には気持ちが悪いのよね。

「引用符の概念がない」のもそうだけど、そのため空文字対策で変数を何らかの文字で囲ってやらないといけないときは慣習的にダブルクォーテーションを使う(人が多い)。これが俺のようにたまにしか Windowsバッチに触れない人間には「変数を引用符で囲む必要ないんじゃないの?」とトラブルの元となってしまうのである。

もう!ほんま Microsoft の設計思想、嫌い(^^;;; なんでこんな仕様にした?

トラックバック(0)

このブログ記事を参照しているブログ一覧: Windowsバッチの「それ引用符じゃないよ」って話

このブログ記事に対するトラックバックURL: https://blog.netandfield.com/mt/mt-tb.cgi/7241

コメントする

このブログ記事について

このページは、shinodaが2026年7月10日 06:41に書いたブログ記事です。

ひとつ前のブログ記事は「常温のお湯割り」です。

次のブログ記事は「一番シンプルな Spring Batch 6 の Chunk 処理例」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら