2009-09-30 126 views
1

我試圖完成以下荒謬的任務:Windows XP批處理文件concat

我有一個文本文件,其中包含一組完全限定的文件名。我想迭代文件並將每行附加到一個公共變量,這可以傳遞給一個命令行工具。例如,該文件可能是:

C:\目錄\ test.txt的

C:\ WINDOWS \的test2.txt

C:\ text3.txt

我想將它們分配給一些變量'a',使得:

a = "C:\dir\test.txt C:\WINDOWS\test2.txt C:\text2.txt" 

第二個問題是 - 什麼是好的ba tch文件參考?我在Windows資料中找到了一些東西,還有很多本土網站,但沒有特別完整。

回答

9

至於引用,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% 
+0

約翰內斯:謝謝你的完整的答案 - 我稍微現在啓發了批處理文件。我有一個相關的問題,你可能會感興趣,我已經發布爲一個新的線程在這裏: http://stackoverflow.com/questions/1506638/windows-batch-file-errorlevel-question – dls 2009-10-01 21:41:27

0

一本好書:Windows NT的Shell腳本由蒂姆·希爾。該版本我已經出版於1998年,但它仍然是有效的Windows命令程序在Windows 2008

0
type *commonfilepart* >> concat_result_file 

操作系統:Windows Server 2003