2011-03-17 10 views
7

Deseo utilizar la función de búsqueda/reemplazo del comando SET de forma dinámica.Windows: ¿Cómo usar "establecer" con búsqueda dinámica y reemplazar?

La manera normal sería como

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

Ahora quiero utilizar variables en la segunda línea en lugar de foo y bar:

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

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

solo me dan

double-foo 
searchrepl% 

También probé

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

¿Cómo puedo lograr esto? Si hago esto sin SET, está bien. Al final quiero que la variable de entorno retenga double-bar.

Respuesta

7

Hay dos formas comunes (y algunas poco frecuentes).

Utilice la expansión doble por llamada.

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

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

En el primer "scan" se expande a CALL SET blah=%blah:foo=bar% y la llamada se amplía el tiempo de segundos para el resultado deseado.

La segunda manera es la variante tardía

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

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

Funciona, porque la expansión retardada se ejecuta después de la expansión por ciento.

Preferiría la variante retrasada, porque es más rápida y segura contra caracteres especiales.

Una forma poco común es la variante FOR-Loop-Variable, también funciona con caracteres especiales en las variables de búsqueda/reemplazo.

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

expansión retardada también se documenta mientras que el 'call' uno no es :-) – Joey

+0

@Joey: Sí, es indocumentado, pero los efectos de' call' son bien conocidos (doble expansión, duplicando los signos de intercalación y desactivando la expansión retrasada) – jeb

+0

+1: muy buena respuesta! – Jon

Cuestiones relacionadas