短い答え-角括弧を使用します:
if [%1]==[] goto :blank
または(引用符付きの引数を処理する必要がある場合は、以下の編集を参照してください):
if [%~1]==[] goto :blank
どうして?あなたが尋ねるかもしれません。まあ、ちょうどエレミヤ・ウィルコックが言ったように:言った http彼らはそれを使用します!わかりましたが、引用符の何が問題になっていますか?
繰り返しになりますが、短い答え:それらは「魔法」です-二重(二重)引用符が単一(二重)引用符に変換されることがあります。そして、それらは最初に一致する必要があります。
この小さなスクリプトを考えてみましょう:
@rem argq.bat
@echo off
:loop
if "%1"=="" goto :done
echo %1
shift
goto :loop
:done
echo Done.
それをテストしましょう:
C:\> argq bla bla
bla
bla
Done.
動作するようです。しかし、今、セカンドギアに切り替えましょう:
C:\> argq "bla bla"
bla""=="" was unexpected at this time.
ブームこれはtrueと評価されず、falseと評価されませんでした。スクリプトDIED。あなたがラインのどこかで原子炉をオフにすることになっていたなら、まあ-頑張ってください。あなたはハリー・ダリアンのように死ぬでしょう。
あなたは考えるかもしれません-OK、引数に引用符を含めることはできません。もしそうなら、これは起こります。間違っていますここにいくつかの慰めがあります:
C:\> argq ""bla bla""
""bla
bla""
Done.
そうそう。心配しないでください- これはうまくいくことがあります。
別のスクリプトを試してみましょう:
@rem args.bat
@echo off
:loop
if [%1]==[] goto :done
echo %1
shift
goto :loop
:done
echo Done.
上記のケースで問題なく動作することを自分でテストできます。これは論理的です-引用符は大括弧とは関係がないため、ここには魔法はありません。しかし、括弧を使って引数をスパイクするのはどうですか?
D:\>args ]bla bla[
]bla
bla[
Done.
D:\>args [bla bla]
[bla
bla]
Done.
運がありません。ブラケットは窒息できないcmd.exe
のパーサーを。
ちょっと邪悪な引用に戻りましょう。議論が引用符で終わったときに問題がありました:
D:\>argq "bla1 bla2"
bla2""=="" was unexpected at this time.
私がちょうど合格した場合:
D:\>argq bla2"
The syntax of the command is incorrect.
スクリプトはまったく実行されません。同じargs.bat
:
D:\>args bla2"
The syntax of the command is incorrect.
しかし"
、そのような場合、-文字の数が「一致する」(つまり-が偶数である)場合、何が得られますか。
D:\>args bla2" "bla3
bla2" "bla3
Done.
NICE-.bat
ファイルがコマンドライン引数を分割する方法について何か学んだことを願っています(ヒント:* bashの場合とはまったく異なります)。上記の引数にはスペースが含まれています。しかし、引用符は自動的に取り除かれません。
そしてargq?それはどのように反応しますか?予想通り:
D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
だから-あなたが言う前に考えてください:「何を知っているのですか?引用符を使ってください。[私にとって、これはより見栄えが良いので]」。
編集する
最近、この回答についてのコメントがありました。まあ、sqareブラケットは引用符で囲まれた引数を渡して、引用符で囲まれていないかのように処理することは「処理できません」。
構文:
if "%~1"=="" (...)
二重引用符によって新しく発見されたいくつかの美徳ではありませんが、最初と最後の文字が二重引用符である場合、引数変数から引用符を取り除くというきちんとした機能の表示です。
この「テクノロジー」は、角かっこでも同様に機能します。
if [%~1]==[] (...)
これを指摘することは有益だったので、新しい答えにも賛成します。
最後に、ファンを二重引用符で囲み""
ます。フォームの引数はあなたの本に存在しますか、それとも空白ですか?ちょうど同じ;)
GOTO BLANK
他の2つのIF
ステートメントに(行のように)角かっこを追加すると、問題が解決しますか?