基本的に私は !var1:SomeText=!var2!! をやろうとしています!! しかし、このコードは機能しません。私は何が欠けていますか?
1 に答える
検索および/または置換に変数を使用する検索および置換操作を実行する場合、展開の順序は重要です。外側の検索と置換の展開が行われる前に、内側の変数を展開する必要があります。遅延拡張はある時点で発生するため、両方に遅延拡張を使用しようとしても明らかに機能しません。
別の変数内で変数を展開するための古典的な方法は、外側には遅延展開を使用し、内側には通常の展開を使用します。echo !var1:SomeText=%var2%!"
何らかの理由で両方に遅延展開を使用したいと思ったと思います。コードのブロック内で展開が発生し、変数の 1 つが同じブロックで設定された可能性があります。ブロックが終了するまで、ブロック内で割り当てられた値を確認できないため、通常の展開は機能しません。
解決策 1
この問題を解決する 1 つの方法は、CALL を使用することです。
call echo %%var1:SomeText=!var2!%%
これは次のように機能します。
パーサーのパーセント フェーズは、ダブル パーセントをシングル パーセントに変換します。
call echo %var1:SomeText=!var2!%
遅延展開は !var2! を展開し、結果として
call echo %var1:SomeText=ReplacementText%
CALL ECHO が実行され、追加レベルのパーセント処理が行われます。検索と置換の展開が実行され
ResultOfSearchAndReplace
、画面にエコーされます。
これは機能しますが、比較的遅いです。また、展開された値>
に&
や などの特殊文字が含まれている場合にも問題が発生する可能性があります|
。私はめったにこのテクニックを使いません。
解決策 2
より高速で信頼性の高い方法は、2 つのステップで拡張を行うことです。まず、値を!var2!
FOR 変数に転送します。次に、FOR 変数を置換文字列として使用し、2 番目のステップで遅延拡張を使用できます。これにより、より脆弱なパーセント拡張が完全に回避されます。
for /f "delims=" %%A in ("!var2!") do echo !var1:SomeText=%%A!
上記は、遅延展開の前に FOR 変数の展開が行われるため機能します。
これは、この問題に対処するための私の好みの方法です。
バッチ パーサーのさまざまなフェーズの詳細な説明については、Windows コマンド インタープリター (CMD.EXE) はスクリプトをどのように解析しますか?に対する jeb の回答を参照してください。