2010-02-24 103 views
0

文件TEST.CMD:顯示從文本文件中的行批處理文件

name=dummy 

for /f "eol=; tokens=1 delims=," %%i in (list.txt) do ( 
echo i: %%i 
set name=%%i 
echo name: %name%) 

文件LIST.TXT包含此行(每行一個名稱):

John 
Tom 
Erica 
Sara 

每時間我推出這批我得到這個輸出:

i: John 
name: dummy 
i:T om 
name: dummy 
i: Erica 
name: dummy 
i: Sara 
name: dummy 

看來,變異能夠得到的名稱未得到賦值%%i

任何想法?

回答

1

你正陷入不使用延遲擴展的舊陷阱。

爲了速戰速決,只要把

​​

這個循環之前,您的批處理文件,並使用!name!代替%name%

CMD在解析命令時展開變量。在這個意義上,命令是單行或「塊」,用括號分隔。完整的for循環僅被解析一次,並且在那個階段%name%被替換爲當時具有的值,即"dummy"。另一方面,延遲擴展使用!而不是%來定義變量名稱,然後在執行命令之前將變量擴展。

無論您何時在括號內的塊內設置變量再次在同一個塊中使用其值,您需要使用延遲擴展。 help set也有一些有關此信息:

延遲的環境變量擴展 是圍繞當前擴大 當一行文字是 讀,而不是執行的時候恰好的 侷限性越來越有用。所述 下面的示例演示 問題立即可變 擴展:

set VAR=before 
if "%VAR%" == "before" (
    set VAR=after 
    if "%VAR%" == "after" @echo If you see this, it worked 
) 

絕不會顯示該消息,因爲 的%VAR%兩個IF語句是 取代的當讀取第一IF 語句,因爲它在邏輯上 包括IF的正文,這是 的複合語句。所以IF 內的複合語句是 真正比較「之前」與「之後」 哪個永遠不會相等。同樣, 下面的例子將無法正常工作 預期:

set LIST= 
for %i in (*) do set LIST=%LIST% %i 
echo %LIST% 

,它會建立的 文件的列表,在當前目錄中,但 反而會剛剛設置的LIST 變量找到的最後一個文件。 同樣,這是因爲%LIST%是 擴展一次當FOR 語句被讀取,並在那個時候 LIST變量爲空。因此,我們正在執行 實際FOR循環是:

for %i in (*) do set LIST= %i 

它只是不斷設置LIST對發現的 最後一個文件。

延遲的環境變量擴展 允許你使用一個不同的 字符(驚歎號)來 在 執行時間擴充環境變量。

set VAR=before 
if "%VAR%" == "before" (
    set VAR=after 
    if "!VAR!" == "after" @echo If you see this, it worked 
) 

set LIST= 
for %i in (*) do set LIST=!LIST! %i 
echo %LIST% 
+0

非常感謝你:如果延遲變量 擴充被啓用,如下 如期運行上面的例子 可以寫!你肯定會保存我的一天。 法比奧玻璃 – 2010-02-24 13:48:20

相關問題