2013-12-03 19 views
0

我有一個簡單的ini文件...真的只是一個key = value文件,我想用它來設置我的腳本的變量。無setlocal的文件中循環動態變量的批處理文件?

我的ini文件:

DATABASE=snoopy 

我的批處理文件代碼

@echo off 
SET DATABASE=woodstock 

FOR /f "tokens=1,2 delims==" %%a in ('C:\mycfg.ini') do (
    echo a=%%a 
    echo b=%%b 
    pause 
    SET %%a=%%b 
    ECHO DATABASE=%DATABASE% 
) 

回聲a和b是正確的,它顯示

a=DATABASE 
b=snoopy 

但是,當時我贊同結束調用SET %% a = %% b之後調用%DATABASE%b 它仍顯示

DATABASE=woodstock 

如果我使用延遲擴展,它可以工作,但只能在本地。我需要它覆蓋全球,所以我不明白爲什麼這不應該工作。

+0

你能解釋一下'local'與'global'是什麼意思嗎? 「local」是當前的CMD窗口,「global」是從「開始」菜單*(例如,所有未來的CMD窗口)打開新的CMD窗口時設置的一組環境變量?順便說一句 - 你將無法修改其他已經打開的CMD窗口。 –

+0

我的意思是使用SetLocal/EndLocal ..實際上考慮它,我在for循環之前使用SetLocal ..也許我應該使用它在文件的頂部。我會嘗試 – Dss

+0

當您啓用延遲擴展時,是否更改了回顯以使用延遲擴展運算符? 'ECHO DATABASE =!DATABASE!' – indiv

回答

0

那麼,沒有必要做任何事情來使它工作。

它的工作原理。

您的問題是,當for塊(代碼中括號中的所有行)被讀取時,變量將被替換爲它們的值,因此echo %DATABASE%行被轉換爲echo woodstock。但變量保持正確的值,在for循環內更改。嘗試將回聲置於for之外並查看其價值。

當變量在塊內部發生變化時需要延遲擴展,並且需要在同一個塊內訪問更改後的值。

+0

是的,我現在看到..我將setlocal enabledelayedexpansion移到了我的文件頂部,並解決了它。謝謝! – Dss

0

好吧,我現在得到它.. 必須在文件頂部啓用延遲擴展,而不是隻在子程序調用。然後將%% a和%% b設置爲延遲變量,並將它們設置爲等於彼此並且工作。最終代碼:

@echo off 
SetLocal EnableDelayedExpansion 

SET DATABASE=woodstock 

FOR /f "tokens=1,2 delims==" %%a in ('C:\mycfg.ini') do (
    set tmpA=%%a 
    set tmpB=%%b 
    SET !tmpA!=!tmpB! 
) 
ECHO DATABASE=%DATABASE% 

,以及改變爲 「史努比」

謝謝大家!

+0

太複雜。對於.... do(設置「%% a = %% b」)'作爲初始代碼,沒有問題且沒有'setlocal'。如上所述,變化在for循環之外是可見的。延遲擴展僅用於查看變量更改其值時在同一個循環內進行的更改。 –

+1

......或者更簡單:'for/f「delims =」%% a in(C:\ mycfg.ini)do set「%% a」' – Aacini

+0

Aacini !!而已!完善。沒有意識到你可以做'SET'VAR = VALUE「'那樣 – Dss