2017-01-07 23 views
2

基本的には、このピースを使用してvar内の文字列を置き換えていますが、ネストされた遅延拡張を正しく実行することはできません。これも可能ですか?バッチは、遅延拡張パラメータを遅延拡張パラメータで置き換えます。

set replace=!replace:!search!=!replaceVal!! 

私は実行時に何が起こっているのか知っています。それはset replace=!replace:!になる最初の完全なセットの後で停止し、それは最後の部分を実行しようとしますが、私の結果を適切に得るためにそれらをエスケープする方法はありますか?

答えて

1

[例]

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 

SET "search=aaa" 
SET "replace=jjj" 
IF DEFINED search (
SET "replace=xxxbbbyyybbbhhh" 
SET "search=bbb" 
SET "replaceval=kkk" 
SET REPLACE 
ECHO after... 
CALL SET "replace=%%replace:!search!=!replaceval!%%" 
SET replace 
) 

GOTO :EOF 
+0

問題は私の検索と置き換えの値は、スクリプトの実行から取得する値に基づいています。 setコマンドはブロック内にあります。 – Matthew

+0

だから?この例は、 'search'、' replaceval'、 'replace'の値がブロック内で設定されていることを示しています。最初の 'set replace'(' replace'を始める各変数の値を示します)では、値は 'aaa'でも' jjj'でもないことに注意してください。それらはブロック内で割り当てられた値に置き換えられました。 'after'は置換後、まだ' aaa'や 'jjj'が見えず、' xxxbbbyyybbbhhh'ブロック内に割り当てられた値は、 'bbb'ブロック内で割り当てられた文字列に代入されたreplacevalブロック「kkk」内にある。 – Magoo

1

これは限りsearchreplace値が空白ではない持っているように動作します。これらの変数は、スペースを持っている場合は、単に適切な区切り記号を挿入、

for /F "tokens=1,2" %%a in ("!search! !replaceVal!") do set replace=!replace:%%a=%%b! 

を:

for /F "tokens=1,2 delims==" %%a in ("!search!=!replaceVal!") do set replace=!replace:%%a=%%b! 
1

私は最も安全な方法はfo llowing:

for /F "delims=" %%S in (^""!search!"^") do (
    for /F "delims=" %%R in (^""!replaceVal!"^") do (
     set "replace=!replace:%%~S=%%~R!" 
    ) 
) 

だから、唯一残っている制限はとにかく、サブ文字列置換構文について適用するものです。

関連する問題