2011-07-28 8 views
1
for .... do (
    call echo !line:%%foo%%=bar! 
) 

変数%foo%をbarに置き換えるためのbatファイルで使用したコードです。
しかし、それは%foo%をリテラル%として扱うように動作します。コマンドecho !line:%%foo%%=bar!(withtout呼び出し)と同じ結果が得られます。 callコマンドが機能しません。 なぜとして動作しないのでしょうか。call echoは、コマンドラインをbatファイルから読み込んだ後に%foo%の値を解析するでしょう。「call echo!line:%% foo %% = bar!」について

答えて

1

パーサフェーズの順番のために動作しません。

set foo=xxx 
set line=Content xxx # %%foo%% # 

第一相用

サンプル実行%の膨張段階です。
これをかっこのブロックで使用しても、この動作は変わりません。そして、ブロックの実行が開始され、行が実行されている場合、次の関連する位相が遅れた拡張期である
call echo !line:%foo%=bar!


は、だから、%foo%はないコンテンツを置き換えられますますので、あなたは
を取得しますcall echo Content xxx # bar #

ここで、パーセント拡張でパーサーが再起動されますが、パーセンテージはもうありません。

fooの内容はあなたのFOR-Loopの中で変更することができるので、ブロックを解析するときだけでなく、いつでも展開する必要があります。

感嘆符をエスケープしても、呼び出し後に最初に有効になるようにしても、遅延拡張は呼び出し実行の内部では機能しないため、機能しません。

代わりにこれを使用することができます。これは、FOR-変数拡張フェーズが遅延拡張フェーズの直前であるため機能します。パーサのフェーズについて

for ... do (
    for /F "delims=" %%F in("!foo!") DO 
    echo !line:%%F=bar! 
) 

いくつかの説明がHow does the Windows Command Interpreter (CMD.EXE) parse scripts?

+0

ありがとう@jebで、私は今それを得ています。 "!"の実行優先度を省略したので、感嘆符を解析します。そして、この質問を投稿する前に、%1パラメータ参照を使用して、call:label!foo!という回避策を得ました。 :) –

関連する問題