2011-03-17 6 views
7

मैं गतिशील फैशन में SET कमांड की खोज/प्रतिस्थापन सुविधा का उपयोग करना चाहता हूं।विंडोज़: डायनामिक खोज और प्रतिस्थापन के साथ "सेट" का उपयोग कैसे करें?

सामान्य तरीके से हो सकता है की तरह

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

अब मैं foo और bar के बजाय दूसरी पंक्ति में चर का उपयोग करना चाहते हैं:

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%! 

यह काम करता है है।

मैं देरी वाले संस्करण को पसंद करूंगा, क्योंकि यह विशेष पात्रों के खिलाफ तेज़ और सुरक्षित है।

एक असामान्य तरीका है, के लिए-लूप-परिवर्तनीय संस्करण है यह खोज में विशेष वर्ण के साथ भी काम करता है/चर बदलें।

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

+0

@Joey नहीं है विलंबित विस्तार भी दर्ज है: हाँ, यह undocumented है, लेकिन' call' के प्रभाव अच्छी तरह से जाना जाता है (डबल विस्तार, कैरेट दोहरीकरण और देरी विस्तार को अक्षम करना) – jeb

+0

+1: बहुत अच्छा जवाब! – Jon

संबंधित मुद्दे

 संबंधित मुद्दे