2012-08-28 36 views
5

我試圖讓CMD相當於以下bash功能的CMD變量代換:爲參數

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

現在,CMD擁有somehwat類似的命令subsitution當兩個模式和替代是 常數:

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

不過,我似乎無法引用變量在那裏 -

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

我該怎麼做?用於指出在批處理文件中的FOR循環內也可以使用的內容的獎勵點。

回答

4

以下(批處理文件)應該工作,並打印「foo.baz」:

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

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

(關於你提到的for循環的事情,你需要給上究竟你的意思更多信息)

+0

謝謝,這也適用於循環內(我的%BAR%和%BAZ%值在循環中是穩定的,幸運的是......)。 – themel

2

來自命令行:
call echo %FOO:%bar%=%baz%%

在分批和用於循環:

@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 

您可以使用延遲擴展而不是第二次調用(調用很昂貴)來優化它,但已經顯示了,所以我將它作爲語法的一個示例。如果您不需要在for塊內設置替換中使用的變量,則可以進一步簡化它。

+1

感謝您向我展示使用CALL來插入變量! – themel