2011-03-17 18 views
7

SET komutunun arama/değiştirme özelliğini dinamik bir biçimde kullanmak istiyorum.Windows: Dinamik arama ile "set" nasıl kullanılır ve değiştirilir?

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

Şimdi onun yerine foo ve bar ikinci satırında değişkenleri kullanmak istediğiniz gibi

normal yolla olacaktır:

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

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

Ben sadece almak

double-foo 
searchrepl% 

Ayrıca

'i denedim
SET blah=%blah:(%search%=%repl%)% 
SET blah=%blah:(%search%)=(%repl%)% 

Bunu nasıl başarabilirim? Bunu SET olmadan yaparsam sorun yok. Sonunda ortam değişkeni double-bar tutmasını istiyorum.

cevap

7

İki yaygın yol vardır (ve bazıları nadirdir).

Çifte genişletme özelliğini kullanarak arayın. o CALL SET blah=%blah:foo=bar% genişler ve çağrı istenilen sonuca saniye zaman genişler "tarama" İlk olarak

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

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

. gecikmeli genişletme genişleme yüzdesi daha sonra işlenecek için

İkinci yol, gecikmeli varyant

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

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

Bu çalışır.

Gecikmeli varyantı tercih ederim çünkü özel karakterlere karşı daha hızlı ve daha güvenli.

bir nadir yolu aramasında özel karakterler ile de çalışır, İÇİN-Döngü-Değişken türüdür/değişkenlerin yerini almıştır.

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

Gecikmeli genişleme tane 'diyoruz ':-) – Joey

+0

@Joey değilken de belgelenmiştir: Evet, belgelenmemiş, ancak' diyoruz' etkileri de carets iki katına (çift genişleme bilinmektedir ve Gecikmeli genişlemeyi devre dışı bırakma) – jeb

+0

+1: çok iyi cevap! – Jon

İlgili konular