,;=<tab>
および<space>
cmd.exe の区切り文字であり、多くの場合、それらが引用符で囲まれておらず、空のスペースのように振る舞う場合は無視されます。おそらくこの場合,
、最初のオペランドの最後として使用され、IF
有効な比較演算子がないことに驚かされます。印刷されますyep
:
if a ;==;,,=a echo yep
(ただし、オペランドの最初の部分に等号がある場合は機能しません)
しかし、これはしません:
if "a ;" == ";,,=a" echo yep
IF
したがって、コンマを使用するときに有効な式を作成するには、引用符が必要です。これは機能します
setLocal enableDelayedExpansion
set test=testString
if "!test:~0,4!" == "test" echo Success
遅延展開なしで置換がすぐに行われ、これは引用符なしで機能します:
set test=testString
setlocal disableDelayedExpansion
if %test:~0,4% == test echo Succes
endlocal
同じ理由で、これは間違った構文式と見なされます(jeb のコメントを参照)。
set "test="
setlocal disableDelayedExpansion
if %test% == test echo Succes
endlocal
完全な答えではないかもしれませんが、近いはずです. と の両方がecho !test:~0,4!
引用echo %test:~0,4%
符なしで機能するため、なぜ正確にIF
失敗するのかという疑問が残ります-コマンドが独自のパーサーを使用するためかもしれませんIF
結論として、文字列を次のように比較するときは常に引用符を使用することをお勧めしますIF
。
- 遅延展開コンマとセミコロンを使用すると、問題が発生します。
- 遅延展開がないと、未定義の変数が問題を引き起こします。