至於引用,SS64.com也不錯。 Rob van der Woude也經常被連接。
至於你的問題,那很簡單:
@echo off
setlocal enableextensions enabledelayedexpansion
set LIST=
for /f %%x in (yourfile.txt) do (
set LIST=!LIST! "%%x"
)
echo %LIST%
endlocal
更深入的解釋:
setlocal enableextensions enabledelayedexpansion
我們允許延遲擴展這裏。這是至關重要的,否則我們將無法操縱隨後的for
循環中的文件列表。
for /f %%x in (yourfile.txt) do (
set LIST=!LIST! "%%x"
)
for /f
遍歷文件中的行,所以正是我們需要在這裏。在每次循環迭代中,我們將下一行添加到LIST
變量中。請注意使用!LIST!
而不是通常的%LIST%
。這表示延遲擴展並確保每次運行此命令時都會重新評估變量。
通常cmd
只要讀取和解析行就將變量擴展爲它們的值。對於cmd
,一條線可以是一條線,也可以是所有作爲線的線,這恰好適用於由我們在此使用的圓括號分隔的塊。因此,對於cmd
而言,完整的塊是一次讀取和解析的語句,無論循環內部運行的頻率如何。
如果我們將在這裏使用%LIST%
代替!LIST!
那麼變量會被立刻被它的值替換(在這一點上是空的)和環看起來會是這樣的:
for /f %%x in (yourfile.txt) do (
set LIST= "%%x"
)
顯然,這ISN我們想要什麼。延遲擴展確保只有在真正需要其值時才擴展變量。在這種情況下,循環內部運行並構建文件名列表。
之後,變量%LIST%
或!LIST!
(現在它再也沒有關係)包含文件中行的列表。
有趣的是,對於set
命令的幫助確切地包括本實施例中爲延遲擴展:
最後,對於延遲 環境變量擴展支持已被添加
。默認情況下,此支持始終爲 禁用,但可能會通過/ V命令 行切換到CMD.EXE啓用/禁用 。請參閱CMD /?
延遲的環境變量擴展 是圍繞當前膨脹 當文本行是 讀取,而不是在執行它恰好的 限制越來越有用。所述 下面的示例演示 問題立即可變 擴展:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
絕不會顯示該消息,因爲 在BOTH IF語句的%VAR%時讀出的第一IF 語句 取代的,因爲它邏輯上包含IF的主體 ,這是一個複合語句 。所以IF 內的複合語句是 真正比較「之前」與「之後」 哪個永遠不會相等。同樣, 下面的例子將無法正常工作 預期:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
,它不會建起來的 文件在當前目錄列表,但 反而只會設置列表 變量到最後找到文件。 再一次,這是因爲%LIST%是 當FOR 012 語句被讀取時僅擴展一次,並且在那個時間 LIST變量爲空。所以 ,我們真正執行的循環是:
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%
約翰內斯:謝謝你的完整的答案 - 我稍微現在啓發了批處理文件。我有一個相關的問題,你可能會感興趣,我已經發布爲一個新的線程在這裏: http://stackoverflow.com/questions/1506638/windows-batch-file-errorlevel-question – dls 2009-10-01 21:41:27