2012-10-04 91 views
2

我有一個bat文件正在讀取另一個txt文件,並將值發送到外部exe文件,該文件生成一個輸出文件與這些命令。批量命令使用txt文件的第一行來創建一個文件

for /f "tokens=*" %%A in (data.txt) do (
:start 

XYZ.exe %%A) 

和data.txt中的內容是這樣的:

abc 1 2 
xyz 2 3 

現在,我的編輯這樣的data.txt中:

name of file: mp3 
abc 1 2 
xyz 2 3 
name of file: mp4 
sss 1 2 
rrr 2 3 
name of file: vob 
eee 1 2 
qqq 2 3 

,我需要使用文件的名稱來創建一個擴展名的文件,每次都要在最後添加。

編輯:

我主要是需要找到一種方法,我可以每次談到時間保存在變量文件名的值。所以,例如在上面的文本文件中,當我運行批處理時,它會看到文件的名稱是否存在。如果它存在,那麼它將在上面的情況下保存該值,即mp3並保存它,然後調用XYZ.exe直到文件的名稱不再來。一旦新的文件名出現,一個方法會調用哪個將XYZ生成的兩個輸出合併成兩個參數,並將它們合併到一個文件中,並將該文件的擴展名附加到mp3中。

然後再次新的文件名將被保存在相同的變量中,並且過程繼續。

如果data.txt中沒有此文件名的單個實例,則擴展名將爲結果文件的txt。我認爲現在應該清楚了。請讓我知道更多的澄清..

+0

由於我們不知道'xyz'程序如何接受輸出文件名,所以我們無法真正幫助您。我必須四次閱讀這個問題才能瞭解你正在嘗試的內容。 – Joey

+0

XYZ程序只需要三個參數並返回一個文件。這並不是真正的問題。我只需要附加擴展名與生成的文件。問題是我們如何檢測到data.txt文件中有新的文件名,我們需要停止處理更多命令,並將此擴展名附加到生成的文件中。 – NitinG

+1

仍然清晰如泥。 – dbenham

回答

1

我將與參數對應的線路,但之前指定的名稱他們。如果名字第一,處理將變得更加複雜:您需要檢查它是否是第一行,因爲如果它不是,您首先需要使用先前存儲的名稱來合併待處理的輸出文件然後存儲新名稱。此外,當您到達data.txt的末尾時,將不會有name of file行來觸發最後一組輸出項目的合併。相反,如果名稱追隨參數,則只需在那裏使用它,然後您甚至不需要存儲它。

也許你能做到這一點是這樣的:

  1. 商店%%A中的變量。

  2. 嘗試從存儲的值中刪除name of file: (使用set var=!var:substr=!語法)。

  3. 將結果值與%%A進行比較。

  4. 如果這兩個值保持相同,則%%A中沒有name of file: 子串,這意味着它是參數列表行而不是文件名行。 (我希望你不會使用該簽名字符串作爲參數集。)在這種情況下,

    • 只是調用。exe文件來處理參數,就像你現在正在做的那樣。
       
  5. 如果值原來不同的,則該行包含一個名稱。因此,

    • ,如果它不是第一個名字,過程中使用以前存儲的名稱輸出文件;

    • 存儲剛纔獲得的名稱供以後使用;

    • 設置一個標誌,指示以下名稱不會是第一個。

  6. 循環後,處理舊名稱,如果標誌設置。

下面是我在實施的步驟上面的列表嘗試:

SETLOCAL EnableDelatedExpansion 
SET NotTheFirstName= 

FOR /F "tokens=*" %%A IN (data.txt) DO (

    SET "name=%%A" 
    SET "name=!ext:name of file: =!" 

    IF "!name!"=="%%A" (
    XYZ.exe %%A 
) ELSE (
    IF DEFINED NotTheFirstName (
     do whatever you need with !oldname! to process your output files 
    ) 
    SET "oldname=!name!" 
    SET NotTheFirstName=1 
) 
) 
do whatever you need with !oldname! once again (to account for the last set of output files) 

注意,如果data.txt格式化是這樣的:

abc 1 2 
xyz 2 3 
name of file: mp3 
sss 1 2 
rrr 2 3 
name of file: mp4 
eee 1 2 
qqq 2 3 
name of file: vob 

即如果文件名行是之後,它所涉及的參數線將會更加簡單:

SETLOCAL EnableDelatedExpansion 

FOR /F "tokens=*" %%A IN (data.txt) DO (

    SET "name=%%A" 
    SET "name=!ext:name of file: =!" 

    IF "!name!"=="%%A" (
    XYZ.exe %%A 
) ELSE (
    do whatever you need with !name! to process your output files 
) 
) 

正如您所看到的,沒有必要存儲名稱以便在以後的迭代中使用,因爲輸出只是在那裏處理並隨後處理。因此,不需要任何標誌或在循環之後再次使用該名稱。

相關問題