ほうこうレポート

ほうようポケモン、こうもりポケモン。

【Bat】「”」が変数の中身の場合のif文の書き方【ダブルクォーテーションの検出】

はじめに

batのプロンプト画面ににファイルをドラッグ&ドロップすると、パスが入力されますよね。

このとき、ファイルのパスのどこかに「半角スペース」が入っていると、batが誤動作を起こさないように強制的に「”」がパスの両端に付与されます。

これではこまった!!
「Batファイルを作成してくれるBatファイル」を使っているのですが、
書き込むときに””があったりなかったりして統一が取れていないと、batが作成してくれたbatファイルがきちんと動かない。
そこで、入力の””の有無で処理を変えようと思い立ったわけですが、「”」のbatにおける処理に大変苦戦したので備忘録を残しておきます。

batでやりたいこと

入力された文章の
先頭が「”」
の場合だけ、ifで別処理をしたい。

例)
「C:\Windows」と入力した場合、”C:\Windows”と出力 →「“(変数)”」を出力
「"C:\Program Files"」と入力した場合、"C:\Program Files"と出力 → 「(変数)」を出力


結論

↓こうすればいけました。

^%firstChar%==^"

具体的なプログラムは↓こんな感じ

  • 入力受け取って
  • 入力の最初の文字抽出して
  • if文で判定を処理
set /p imput=
set firstChar=%imput:~0,1%

if ^%firstChar%==^" (
echo start "" %imput% >> %name%.bat
) else (
echo start "" "%imput%" >> %name%.bat
)

なぜ?

if firstChar==" (中身)

ここからの進化の過程を
if firstChar==" (中身)

変数の中身を扱う

これは説明要らないかもしれませんが。
batの関数内で変数の中身を参照したいときは
%firstChar%
のように%で囲む必要があります。

if %firstChar%==" (中身)
「”」のエスケープ

「”」は普通bat内の言語として使うものなので、bat言語とは別の、人間語として「”」を用いたい場合は、bat内では「^”」と入力(エスケープ)をする必要がある

if %firstChar%==^" (中身)
変数が「”」の場合、変数の方にもエスケープが必要だ!
if %firstChar%==^" (中身)

この書き方でfirtstCharに「”」が入ったとき、
batファイルは「if “==^”」と書かれたと認識します。
後ろのはエスケープしてありますが、前の「”」はエスケープしていないので、””が閉じられていない状態になります(であってるんですよね?)
そのため前の変数にも「^」が必要になります。

if ^%firstChar%==^" (中身)

NG集

NG

if firstChar==^" (中身)

「firstChar」が「”」と同じだったら?
という意味なので、常にFALSEが返される


NG

if %firstChar%==” (中身)

if “==” (中身)って書いたと思われてる。条件文どこだよって落ちる。


NG

if ^firstChar==^" (中身)

if firstChar==^" (中身)
の時と同じ。

NG

if "firstChar"==^" (中身)

「firstCharと”が同じだったら」→常にFALSE

NG

if "^firstChar" ==^"(中身)

「^firstChar」って文章が「”」と同じだったら→常にFALSE

NG

if %firstChar%==^" (中身)

if “==^” (中身)書いたと思われてる?

おわりに

batファイルの言語作ったやつを許すな
まだまだbatファイルは初心者なので、もっといい方法とかあったら教えてください。