13

遅延展開変数を使用せずに if ステートメントで文字列操作がインラインで機能するのはなぜですか?それ以外の場合は失敗します。例えば:

set test=testString
if %test:~0,4%==test echo Success

これは正しく機能します。戻るSuccess。ただし、次のようにすると:

setLocal enableDelayedExpansion
set test=testString
if !test:~0,4!==test echo Success

エラーが表示されます -4!==test was unexpected at this time.

明らかに、ifステートメントで変数set comp=!test:~0,4!を使用するだけで、次のようなことを行うことでこれを回避できます。!comp!

4

2 に答える 2

10

,;=<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

  1. 遅延展開コンマとセミコロンを使用すると、問題が発生します。
  2. 遅延展開がないと、未定義の変数が問題を引き起こします。
于 2013-12-03T00:10:46.747 に答える