パーサフェーズの順番のために動作しません。
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?
出典
2011-07-28 12:09:43
jeb
ありがとう@jebで、私は今それを得ています。 "!"の実行優先度を省略したので、感嘆符を解析します。そして、この質問を投稿する前に、%1パラメータ参照を使用して、call:label!foo!という回避策を得ました。 :) –