2012-08-28 13 views
5

Próbuję dostać równowartość CMD z następujących bash cecha:CMD zmienna podstawienie parametrów

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

Teraz CMD ma somehwat podobną subsitution polecenia, gdy zarówno wzór i zastąpienie stałe:

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

jednak nie wydaje się odwołać zmiennych tam -

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

Jak to zrobić? Punkty premiowe za wskazanie czegoś, co działa również wewnątrz pętli FOR w pliku wsadowym.

Odpowiedz

4

Poniższy (plik wsadowy) powinien działać i drukuje „foo.baz”:

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

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

(. O rzeczą dla pętli można wymienić, trzeba dać więcej informacji na temat tego, co dokładnie masz na myśli)

+0

Dzięki, że działa, również w pętli (moje wartości% BAR% i% BAZ% są stabilne w pętli, na szczęście ...). – themel

2

z linii poleceń:
call echo %FOO:%bar%=%baz%%

W partii i dla pętli:

@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 

Możesz ją zoptymalizować za pomocą opóźnionego rozszerzenia zamiast drugiego połączenia (połączenia są drogie), ale zostało to już pokazane, więc zostawiłem je jako przykład składni. Jeśli nie musisz ustawiać zmiennej używanej w zastępstwie w bloku for, możesz ją uprościć.

+1

Dzięki za pokazanie mi użycia CALL do interpolacji zmiennych! – themel