0

多数の個別のフォルダーに、同じ名前のファイルが多数あります。例:
mods\Lady Knight\media\units\items\armor
mods\Paladin\media\units\items\armor
mods\Necromancer\media\units\items\armor


これらのフォルダーのそれぞれに、たとえば次のようなものがあり
ます

これらの .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 ほどのファイルのわずかに異なる独自のコピーを含む、約 12 のフォルダーがあります。フォルダーの 1 つをコピーして、マスターの開始点として使用できます。最終目標は、異なるフォルダのソース ファイルのそれぞれからのワードローブ セクションを含む (150 ほどのファイルの) マスター コピーです。過去に Windows と Linux のキャリッジ リターンが同じではないという問題があったため、Windows で行うことをお勧めします。

私は大学で約 1 年半前に基本的なスクリプトのクラスを受講しましたが、これはそれよりもかなり上です。バッチファイルのロジックは次のようになると思います

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セクションの最後のオカレンスだけを抽出するため、ファイルを2回読み取る必要があります。1回目はコピーを開始する行を見つけ、2回目は実際に抽出を行います。

    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 に答える