2012-05-16 39 views
0

我在一堆單獨的文件夾中有大量相同名稱的文件。例如:
MODS \夫人騎士\媒體\單位\項目\裝甲
MODS \帕拉丁\媒體\單位\項目\裝甲
MODS \死靈\媒體\單位\項目\裝甲
如何有選擇地複製一系列文件中的文本並粘貼到一個文件中?

在每這些文件夾中會有例如之一:
a_chest_magic_04a.dat
a_chest_magic_04b.dat
a_chest_magic_04c.dat

這些.dat文件的擴展名不同真的只是.txt文件。在這些文件中的每一個文件中有一堆文本行,它們在不同文件夾中的相同名稱的文件中是相同的。因此,例如,第幾行的這些:

MODS \夫人騎士\媒體\ \單位項目\裝甲\ a_chest_magic_04a.dat
MODS \帕拉丁\媒體\ \單位項目\裝甲\ a_chest_magic_04a.dat
MODS \死靈\媒體\ \單位項目\裝甲\ a_chest_magic_04a.dat

將是完全一樣的,但MODS

之間

\夫人騎士\媒體\ \單位項目\裝甲\ a_chest_magic_04a.dat MODS的\ Lady Knight \ media \ units \物品\裝甲\ a_chest_magic_04b.dat

的文字會有所不同。
然而,在每個文件的結尾是這樣的:

[WARDROBE] 
<STRING>CLASS:DESTROYER 
<STRING>TEXTURE:media/wardrobe/destroyer/dest_scale_chest.png 
<STRING>MESH:media/wardrobe/destroyer/scale_set.mesh 
<STRING>ICON:scalevest 
[/WARDROBE] 
[WARDROBE] 
<STRING>CLASS:ALCHEMIST 
<STRING>TEXTURE:media/wardrobe/alchemist/alchemist_hvyleather_chest.png 
<STRING>MESH:media/wardrobe/alchemist/hvyleather_set.mesh 
[/WARDROBE] 
[WARDROBE] 
<STRING>CLASS:VANQUISHER 
<STRING>MESH:media/wardrobe/vanquisher/vanquisher_buckled.mesh 
<STRING>TEXTURE:media/wardrobe/vanquisher/buckled_chest.png 
<STRING>ICON:vanq_buckled_body 
[/WARDROBE] 
[WARDROBE] 
<STRING>CLASS:LADY KNIGHT 
<STRING>TEXTURE:media\wardrobe\ladyknight\buckled_chest.png 
<STRING>MESH:media\wardrobe\ladyknight\vanquisher_buckled.mesh 
<STRING>ICON:vanq_buckled_body 
[/WARDROBE] 
[/UNIT] 

最後一組[衣櫃】標籤之間的界限是在文件的每個版本不同。我想要做的就是將它們組合起來,使所有這些不同的[衣櫃】羣體在年底上市所以a_chest_magic_04a.dat最後一部分是這樣的:

[WARDROBE] 
<STRING>CLASS:DESTROYER 
<STRING>TEXTURE:media/wardrobe/destroyer/dest_scale_chest.png 
<STRING>MESH:media/wardrobe/destroyer/scale_set.mesh 
<STRING>ICON:scalevest 
[/WARDROBE] 
[WARDROBE] 
<STRING>CLASS:ALCHEMIST 
<STRING>TEXTURE:media/wardrobe/alchemist/alchemist_hvyleather_chest.png 
<STRING>MESH:media/wardrobe/alchemist/hvyleather_set.mesh 
[/WARDROBE] 
[WARDROBE] 
<STRING>CLASS:VANQUISHER 
<STRING>MESH:media/wardrobe/vanquisher/vanquisher_buckled.mesh 
<STRING>TEXTURE:media/wardrobe/vanquisher/buckled_chest.png 
<STRING>ICON:vanq_buckled_body 
[/WARDROBE] 
[WARDROBE] 
<STRING>CLASS:LADY KNIGHT 
<STRING>TEXTURE:media\wardrobe\ladyknight\buckled_chest.png 
<STRING>MESH:media\wardrobe\ladyknight\vanquisher_buckled.mesh 
<STRING>ICON:vanq_buckled_body 
[/WARDROBE] 
[WARDROBE] 
<STRING>CLASS:PALADIN 
<STRING>MESH:media/wardrobe/paladin/vanquisher_buckled.mesh 
<STRING>TEXTURE:media/wardrobe/paladin/buckled_chest.png 
<STRING>ICON:paladin_buckled_body 
[/WARDROBE] 
[WARDROBE] 
<STRING>CLASS:NECROMANCER 
<STRING>TEXTURE:media/wardrobe/alchemist/alchemist_hvyleather_chest.png 
<STRING>MESH:media/wardrobe/alchemist/hvyleather_set.mesh 
[/WARDROBE] 
[/UNIT] 

有十幾每個文件夾都包含相同的150個左右文件的各自不同的副本。我可以複製其中一個文件夾作爲主文件的起點。最終目標是包含來自每個不同文件夾源文件的衣櫃部分的主副本(150個文件的副本)。我寧願在Windows中執行此操作,因爲在過去Windows和Linux回車不一樣的情況下,我遇到了麻煩。

我在大學大約一年半前開了一個基本的腳本類,但是這比上面的要高很多。我認爲該批處理文件的邏輯可能會像

1)從每個文件
2月底刪除[/ UNIT])從一個文件中的每個實例複製最後一個衣櫃部分並連接這到底主
3)重複上述文件夾
4)添加[/ UNIT]到主文件

人與一些老闆的腳本技能可以幫我結束在每個文件?

回答

0

您的策略很好。

  1. 用於迭代所有文件,FOR是你的朋友。閱讀HELP FOR,並嘗試在命令行簡單的東西

    for /r %a in (a_chest_*.dat) do @echo %a 
    

    確保你得到你想要的

  2. 這個代碼轉移到一個BAT文件中的文件,則需要更換%A至%%一。此外,您想要複製第一個文件以用作所有其他文件的種子。嘗試這樣的事情..

    set first= 
    for /r %%a in (a_chest_*.dat) do (
        echo %%a 
        if .!first!==. (
        copy %%a wardrobes.txt 
        set first=%%a 
    ) 
    ) 
    
  3. 提取每個文件的最後部分衣櫃更棘手

    ,因爲你要只提取衣櫃節的最後出現了一點,你需要閱讀文件兩次,第一次找到複製應該開始的行,第二次真正進行提取。

    FOR是你的朋友,首先要找到最後的[衣櫃】的線條和最後[/ UNIT]

    set linenum=0 
    for /f "tokens=* delims=" %%a in (a_chest_magic_04c.dat) do (
        set /a linenum+=1 
        if %%a==[WARDROBE] set fromhere=!linenum! 
        if %%a==[/UNIT] set tohere=!linenum! 
    ) 
    

    和第二,要找到那個地方,並提取線

    set linenum=0 
    for /f "tokens=* delims=" %%a in (a_chest_magic_04c.dat) do (
    set /a linenum+=1 
    if !linenum! geq !fromhere! (
        if !linenum! lss !tohere! (
        echo %%a 
        ) 
    ) 
    ) 
    goto :eof 
    
  4. 把我們走到這一步,一起

    @echo off 
    setLocal EnableDelayedExpansion 
    set first= 
    for /r %%a in (*.dat) do (
        if .!first!==. (
        copy %%a wardrobes.txt 
        set first=%%a 
    ) else (
        (
         call :extractlastwardrobe %%a 
        ) >>wardrobes.txt 
    ) 
    ) 
    goto :eof 
    
    :extractlastwardrobe 
    set linenum=0 
    for /f "tokens=* delims=" %%a in (%1) do (
        set /a linenum+=1 
        if %%a==[WARDROBE] set fromhere=!linenum! 
        if %%a==[/UNIT] set tohere=!linenum! 
    ) 
    set linenum=0 
    for /f "tokens=* delims=" %%a in (%1) do (
        set /a linenum+=1 
        if !linenum! geq !fromhere! (
        if !linenum! lss !tohere! (
         echo %%a 
        ) 
    ) 
    ) 
    goto :eof 
    

和你是差不多完成。您仍然需要從種子文件中刪除[/ UNIT]行並將其添加到結果文件的末尾。我把這留作練習。

相關問題