0

我在一堆单独的文件夹中有大量同名文件。例如:
mods\Lady Knight\media\units\items\armor
mods\Paladin\media\units\items\armor
mods\Necromancer\media\units\items\armor

在这些文件夹中的每一个中都会有例如:
a_chest_magic_04a.dat
a_chest_magic_04b.dat
a_chest_magic_04c.dat

这些 .dat 文件实际上只是具有不同扩展名的 .txt 文件。在这些文件中的每一个中都有一堆文本行,这些文本行在不同文件夹中的同名文件中是相同的。因此,例如这些的前几行:

mods\Lady Knight\media\units\items\armor\a_chest_magic_04a.dat
mods\Paladin\media\units\items\armor\a_chest_magic_04a.dat
mods\Necromancer\media\units\items\armor\a_chest_magic_04a.dat

将完全相同,但在

mods\Lady Knight\media\units\items\armor\a_chest_magic_04a.dat mods\Lady Knight\media\units\items\armor\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]

最后一组 [WARDROBE] 标记之间的行在文件的每个版本中都不同。我想要做的是将它们组合起来,以便在最后列出所有这些不同的 [WARDROBE] 组,因此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)从每个文件的末尾删除 [/UNIT]
2)从文件的每个实例中复制最后一个衣柜部分并将其连接到主文件的末尾
3)对文件夹中的每个文件重复上述操作
4)添加 [ /UNIT] 到主文件的末尾

有一些老板脚本技能的人可以帮助我吗?

4

1 回答 1

0

你的策略很好。

  1. 迭代所有文件,FOR是你的朋友。HELP FOR在命令行中阅读并尝试一些简单的东西

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

    确保你得到你想要的所有文件

  2. 要将此代码移动到 BAT 文件中,您需要将 %a 替换为 %%a。此外,您希望复制第一个文件以用作所有其余文件的种子。试试这样的..

    set first=
    for /r %%a in (a_chest_*.dat) do (
      echo %%a
      if .!first!==. (
        copy %%a wardrobes.txt
        set first=%%a
      ) 
    )
    
  3. 提取每个文件的最后一个 WARDROBE 部分有点棘手

    因为您只想提取 WARDROBE 部分的最后一次出现,您需要读取文件两次,第一次是找到应该开始复制的行,第二次是实际进行提取。

    FOR是你的朋友,先找到最后一个[WARDROBE]和最后一个[/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] 行并将其添加到结果文件的末尾。我把它留作练习。

于 2012-05-16T10:22:59.013 回答