2011-03-17 26 views
7

我想動態地使用SET命令的搜索/替換功能。Windows:如何使用「設置」與動態搜索和替換?

方式,一般會像

SET blah=double-foo 
SET blah=%blah:foo=bar% 

現在我想在第二行,而不是foobar使用變量:

SET search=foo 
SET repl=bar 
SET blah=double-foo 

ECHO %blah% 
SET blah=%blah:%search%=%repl%% 
ECHO %blah% 

我只得到

double-foo 
searchrepl% 

我也試過

SET blah=%blah:(%search%=%repl%)% 
SET blah=%blah:(%search%)=(%repl%)% 

我該如何做到這一點?如果我這樣做沒有SET這很好。最後我想讓環境變量保持double-bar

回答

7

有兩種常見的方法(和一些不常見的)。

使用通過調用進行雙重擴展。

SET search=foo 
SET repl=bar 
SET blah=double-foo 

CALL SET blah=%%blah:%search%=%repl%%% 

在第一「掃描」它擴展爲CALL SET blah=%blah:foo=bar%和呼叫擴展秒時間至所期望的結果。

第二種方法是延遲變種

SETLOCAL EnableDelayedExpansion 
SET search=foo 
SET repl=bar 
SET blah=double-foo 

SET blah=!blah:%search%=%repl%! 

它的工作原理,因爲延遲擴展百分號展開後執行。

我寧願延遲變體,因爲它對特殊字符更快更安全。

一種不常見的方法是FOR-Loop-Variable變體,它可以在搜索/替換變量中使用特殊字符。

SETLOCAL EnableDelayedExpansion 
SET "search=foo>" 
SET "repl=bar & bar" 
SET "blah=double-foo> &|<>" 

for %%s in ("!search!") do (
    for %%r in ("!repl!") do (
    SET "blah=!blah:%%~s=%%~r!" 
) 
) 
+0

延遲擴展也記錄而'call'一個不是:-) – Joey 2011-03-17 10:35:27

+0

@Joey:是的,它是未記錄的,但call'的'的影響是公知的(雙膨脹,加倍插入記號和禁用延遲擴展) – jeb 2011-03-17 10:44:15

+0

+1:非常好的答案! – Jon 2011-03-17 10:51:21