将子图中的每个文件递归解析为输出文件夹,同时保持相对性

时间:2017-12-06 13:33:50

标签: windows batch-file

我正在使用以下批处理代码转换某个目录中的所有文件,如果目标文件尚不存在但是我仍然坚持要让它运行通过其中的每个子图和文件(并保持输出相对于该子图)

所以我目前使用它:

for %%f in (input/textures/*.*) do ( IF NOT EXIST "ouput/textures/%%~nf.dds" (
"bin/ThempImageParser.exe" "input/textures/%%f" "ouput/textures/%%~nf.dds"
)
)

这适用于单个文件夹(如预期的那样),它接受该特定文件夹中的所有文件,并将它们作为参数传递给我的可执行文件,然后在第二个参数的路径上输出文件。

然而,这也包含一个缺陷(这是一个额外的问题,但是..)因为如果output -folder-不存在它不起作用,所以如果可能的话我还希望它创建文件夹,如果需要的话

我发现了一些批处理文档(我对Batch没有多少经验)向我展示了一个名为FORFILES和/ R参数的命令,但是我无法调整它以保持相对路径输出也是,它需要字符串操作,我不知道如何做到这一点。

所以我所追求的结果是这样的,它比任何文件都要深入“输入/纹理/例如:

input/textures/some/very/deep/submap/why/does/it/go/on/myfile.anyExtension

然后它应该接受该文件(和相对路径)并基本上用“output”更改“input”并用.dds替换文件扩展名,如下所示:

ouput/textures/some/very/deep/submap/why/does/it/go/on/myfile.dds

并将这两个字符串传递给我的可执行文件。

1 个答案:

答案 0 :(得分:1)

@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir\t w o"
SET "destdir=U:\destdir\wherever\something"

FOR /f "delims=" %%a IN ('xcopy /y /L /s "%sourcedir%\*"') DO (
 SET "destfile=%%a"
 SET "destfile=!destfile:*%sourcedir%=%destdir%!"
 IF /i "%%a" neq "!destfile!" (
  FOR %%m IN ("!destfile!") DO IF NOT EXIST "%%~dpm%%~na.dds" (
   ECHO MD "%%~dpm"
   ECHO "bin\ThempImageParser.exe" "%%a" "%%~dpm%%~na.dds"
  )
 )
)

GOTO :EOF

您需要更改sourcedirdestdir的设置以适合您的具体情况。

首先,使用xcopy选项执行/L,以仅列出xcopy复制的文件的各个完整名称。

将从%%a找到的每个名称分配给destfile,然后从该文件名中删除source-directoryname之前的所有字符,并将该字符串替换为目标目录名。

这将产生文件的目标名称(具有原始扩展名)。唯一的例外是最后一个输出行,它是一个文件计数报告。由于此行包含源目录名,因此不会进行替换,因此%%a将与!destfile!相同 - 因此我们将其删除。

现在将目标文件名分配给元变量,以便我们可以选择其各个部分,如果从目标驱动器和路径名创建的文件名,原始文件的名称部分和.dds不存在,那么make目标directoryname并执行imageparser,提供所需的输出文件名。

请注意,最后两个是ECHO,而不是为了测试目的而执行。删除ECHO以实际执行命令。

请注意/是一个开关指示符,\是一个目录分隔符。

请注意,如果目录已存在,MD将报告错误。将2>nul附加到md命令的末尾以禁止显示该错误消息。