2012-08-28 34 views
5

que estoy tratando de obtener el equivalente CMD de la función después de bash:CMD sustitución de variables para los parámetros

$ FOO=foo.bar 
$ BAR=bar 
$ BAZ=baz 
$ echo ${FOO/$BAR/$BAZ} 
foo.baz 

Ahora, CMD tiene posibilidad de sustitución de comandos somehwat similar cuando tanto el patrón y la sustitución son constante:

C:\>set FOO=foo.bar 
C:\>set BAR=bar 
C:\>set BAZ=baz 
C:\>echo %FOO:bar=baz% 
foo.baz 

sin embargo, me parece que no puede hacer referencia a variables allí -

C:\>echo %FOO:%BAR%=%BAZ%% 
%foo:bar=baz% 

¿Cómo lo haría? Puntos de bonificación por señalar algo que también funciona dentro de un bucle FOR en un archivo por lotes.

Respuesta

4

La siguiente (archivo por lotes) debe trabajar y grabados "foo.baz":

setlocal enabledelayedexpansion 
    set FOO=foo.bar 
    set BAR=bar 
    set BAZ=baz 

    echo !FOO:%BAR%:%BAZ%! 

(. Sobre la cosa bucle-FOR mencionas, es necesario dar más información acerca de qué es exactamente lo que quiere decir)

+0

Gracias, eso también funciona dentro de un bucle (mis valores% BAR% y% BAZ% son estables durante el ciclo, afortunadamente ...). – themel

2

Desde la línea de comandos:
call echo %FOO:%bar%=%baz%%

En lotes y para el bucle:

@echo off 
    set FOO=foo.bar 
    set BAR=bar 
    set BAZ=baz 
for %%N in (baz ban bak) do (
set BAZ=%%N_AndSomething 
call :expand 
) 
goto :eof 

:expand 
call echo %%FOO:%BAR%=%BAZ%%% 
goto :eof 

Puede optimizarlo utilizando la expansión retrasada en lugar de la segunda llamada (las llamadas son costosas), pero eso ya se mostró, así que lo dejé como un ejemplo de sintaxis. Si no necesita establecer la variable utilizada en sustitución dentro del bloque for, puede simplificarlo aún más.

+1

¡Gracias por mostrarme el uso de CALL para interpolar variables! – themel

Cuestiones relacionadas