はじめに
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ファイルは初心者なので、もっといい方法とかあったら教えてください。