将文件通过几个步骤过程,一次一个地放入批处理文件中



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

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

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

FOR %%a IN ("Game Files*.BNK") DO (MD "%%~na" 2>nul) 
FOR %%b IN ("Game Files*.BNK") DO ("Toolsbnkextr.exe" "%%b" & MOVE *.wav "ToolsDecoding")
FOR %%c IN (ToolsDecoding*.WAV) DO ("Toolsww2ogg.exe" "%%c" --pcb Toolspacked_codebooks_aoTuV_603.bin & DEL "%%c")
FOR %%d IN (ToolsDecoding*.OGG) DO ("Toolsrevorb.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文件移动到相关文件夹中,所以我最终得到这样的东西。

GameSoundFX001.ogg
GameSoundFX002.ogg
GameSoundFX003.ogg
GameMusic001.ogg
GameMusic002.ogg
GameMusic003.ogg

但问题是...

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

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

3(第四行不会将文件移动到正确的文件夹中。它们保留在\工具\解码\

所以,我想我的问题是,我怎样才能让这个批处理文件一次一个地运行每个 .bnk 文件的过程,然后将.ogg文件放入我们使用第一行代码创建的文件夹中?

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

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

尽可能避免多命令块/代码行(嵌套、&&&(。它使调试时更容易遵循,并且第一次就

更容易正确。未经测试:

@setlocal EnableExtensions
@set _decodingDir=ToolsDecoding
@for %%I in ("Game Files*.BNK") do @call :ProcessBNK "%%I"
@exit /b
:ProcessBNK
@set _targetDir="%~n1"
@md %_targetDir% 2>nul
@Toolsbnkextr.exe %1
@move *.wav %_decodingDir%
@for %%I in (%_decodingDir%*.WAV) do @call :ProcessWAV "%%I"
@for %%I in (%_decodingDir%*.OGG) do @Toolsrevorb.exe "%%I"
@move %_decodingDir%*.ogg %_targetDir%
@move %1 %_targetDir%
@exit /b
:ProcessWAV
@Toolsww2ogg.exe %1 --pcb Toolspacked_codebooks_aoTuV_603.bin
@del %1
@exit /b

删除前导@符号以在调试时显示行(假设命令窗口中的 echo 处于打开状态(。

谢谢 jwdonahue!

你的代码几乎工作了。我只需要稍微调整一下,因为.ogg文件保留在\工具\解码中。我在\游戏文件\中使用多个.bnk文件对其进行了测试,它起作用了!非常感谢。

setlocal EnableExtensions
for %%I in ("Game Files*.BNK") do call :ProcessBNK "%%I"
exit /b
:ProcessBNK
set _targetDir="%~n1"
md %_targetDir% 2>nul
Toolsbnkextr.exe %1
move *.wav ToolsDecoding
for %%I in (ToolsDecoding*.WAV) do call :ProcessWAV "%%I"
for %%I in (ToolsDecoding*.OGG) do Toolsrevorb.exe "%%I"
move ToolsDecoding*.OGG %_targetDir%
move %1 %_targetDir%
exit /b
:ProcessWAV
Toolsww2ogg.exe %1 --pcb Toolspacked_codebooks_aoTuV_603.bin
del %1
exit /b

最新更新