通过批处理文件一次一次地通过多个步骤处理文件

时间:2018-10-04 18:44:41

标签: batch-file cmd

对不起,如果这对您来说是一张大脸。我是一个初学者,只是想节省一些时间。

我有一些.bnk文件,我希望通过几个步骤来从文件中提取音频。我的问题是,提取的文件在创建时会相互覆盖,而我试图将提取的文件放到它自己的文件夹中。

这是我当前的批处理文件:

FOR %%a IN ("Game Files\*.BNK") DO (MD "%%~na" 2>nul) 
FOR %%b IN ("Game Files\*.BNK") DO ("Tools\bnkextr.exe" "%%b" & MOVE *.wav "Tools\Decoding")
FOR %%c IN (Tools\Decoding\*.WAV) DO ("Tools\ww2ogg.exe" "%%c" --pcb Tools\packed_codebooks_aoTuV_603.bin & DEL "%%c")
FOR %%d IN (Tools\Decoding\*.OGG) DO ("Tools\revorb.exe" "%%d" & MOVE "%%a" "%%~na")
FOR %%f IN ("Game Files\*.BNK") DO (DEL "%%f")
echo BNK files deleted, enjoy your unpacked audio!
pause 
exit

我在\ Game Files \文件夹中有多个.bnk文件,例如:

GameSoundFX.bnk
GameMusic.bnk

我的代码的第一行基于.bnk的文件名创建一个新文件夹。

FOR %%a IN ("Game Files\*.BNK") DO (MD "%%~na" 2>nul) 

接下来的三行将.bnk置于一系列提取和编解码器过程中。首先,它创建多个.wav文件,然后将它们转换为.ogg文件。然后,我希望将这些.ogg文件移动到相关的文件夹中,以便得到这样的结果。

\GameSoundFX\0001.ogg
\GameSoundFX\0002.ogg
\GameSoundFX\0003.ogg
\GameMusic\0001.ogg
\GameMusic\0002.ogg
\GameMusic\0003.ogg

但是问题是...

1)第一行首先创建所有文件夹

2)第二行创建所有.wav文件(第二个.bnk文件中的.wav文件覆盖第一个)

3)第四行未将文件移动到正确的文件夹中。它们保留在\ Tools \ Decoding \

所以,我想我的问题是,如何让该批处理文件一次与每个.bnk文件一起在整个过程中运行,然后将.ogg文件放入我们用第一行代码创建的文件夹中?

3 个答案:

答案 0 :(得分:2)

您可以轻松地嵌套命令以确保它一次处理一个文件。当您将命令嵌套在带括号的代码块中时,它有助于缩进代码,从而使您知道什么属于什么。我不确定您的某些代码在做什么,因此我在代码中做了注释。看看是否有帮助。

@ECHO off
FOR %%a IN ("Game Files\*.BNK") DO (
    MD "%%~na" 2>nul
    Tools\bnkextr.exe" "%%a"
    MOVE *.wav "Tools\Decoding"
    FOR %%c IN (Tools\Decoding\*.WAV) DO (
        "Tools\ww2ogg.exe" "%%c" --pcb Tools\packed_codebooks_aoTuV_603.bin
        DEL "%%c"
    )
    FOR %%d IN (Tools\Decoding\*.OGG) DO (
        "Tools\revorb.exe" "%%d"
        REM ##### Unsure what you are trying to move here ####
        MOVE "%%d" "%%~na"
    )
    REM Deleting the .BNK file
    DEL "%%a"
)
pause 
exit

答案 1 :(得分:0)

尽可能避免使用多命令代码块/代码行(嵌套&&&)。调试时,它使事情变得更容易遵循,并且在第一次安装时也变得更加容易。

未经测试:

@setlocal EnableExtensions

@set _decodingDir=Tools\Decoding
@for %%I in ("Game Files\*.BNK") do @call :ProcessBNK "%%I"
@exit /b

:ProcessBNK
@set _targetDir="%~n1"
@md %_targetDir% 2>nul
@Tools\bnkextr.exe %1
@move *.wav %_decodingDir%
@for %%I in (%_decodingDir%\*.WAV) do @call :ProcessWAV "%%I"
@for %%I in (%_decodingDir%\*.OGG) do @Tools\revorb.exe "%%I"
@move %_decodingDir%\*.ogg %_targetDir%
@move %1 %_targetDir%
@exit /b

:ProcessWAV
@Tools\ww2ogg.exe %1 --pcb Tools\packed_codebooks_aoTuV_603.bin
@del %1
@exit /b

在调试时删除前导@符号以显示行(假定在命令窗口中启用了echo)。

答案 2 :(得分:-1)

谢谢jwdonahue!

您的代码几乎可以正常工作。我只需要进行一些调整,因为.ogg文件保留在\ Tools \ Decoding中。我在\ Game Files \中使用多个.bnk文件对其进行了测试,并且可以正常工作!非常感谢。

run