如何复制批处理文件输出的输入子目录结构?

如何复制批处理文件输出的输入子目录结构?

我想使用这一行脚本在一个目录中的所有 *.xmp 文件上运行一个 awk 脚本,并将处理后的文件放在具有相同子目录结构的第二个目录中。

批处理文件 FixXMP.bat 如下所示:

 forfiles -p "%1" -s -m *.xmp /c "cmd /c gawk -f fixxmp.awk < @file > %2\@file"

我像这样运行脚本:

 FixXMP indir outdir

其中 indir 是包含子目录中输入文件的目录,而 outdir 是复制子目录并存储输出文件的位置。

除了所有输出文件都进入输出目录而不会重复输入子目录结构之外,这可以正常工作。

我不知道如何实现这一点。有人能帮我修改这个脚本来复制输出的输入子目录结构吗?

谢谢,

麦克风

答案1

  • 一旦 forfiles 递归到子文件夹,静态%2目标就不再匹配。
  • 您还需要使用<@path输入文件

我看到两种可能的解决方案:

  1. 使用forfiles选项@RelPath
  2. 使用for /f解析的输出dir /B/S "%1\*.xmp",然后indiroutdir找到的驱动器:\path\filename.ext 中进行交换。

如果您首先复制目录结构,则xcopy /S/T/E "%InDir%" "%OutDir%\"无需检查每个目标目录是否已经存在(正如我的评论中指出的那样)。

提供的内容fixXMP.awk与以下内容位于同一文件夹中fixXMP.bat

:: FixXMP.bat
@Echo off
xcopy /S/T/E "%~1" "%~2\"
forfiles -p "%~1" -s -m *.xmp /c "cmd /c gawk -f %~dp0\fixXMP.awk <@path >%~2\@relpath"

运行批处理之前,我的 RAM 驱动器 A 上的示例输出:

> tree A:\ /F
A:\
├───InDir
│   └───Sub1
│       └───Sub2
│               Test.xmp
└───OutDir

之后 :

> tree A:\ /F
A:\
├───InDir
│   └───Sub1
│       └───Sub2
│               Test.xmp
└───OutDir
    └───Sub1
        └───Sub2
                Test.xmp

批次变体具有for /f相同的结果:

:: FixXMP.bat
@Echo off & SetLocal EnableDelayedExpansion
xcopy /S/T/E "%~1" "%~2\"
For /f "delims=" %%A in ('Dir /B/S "%1\*.xmp" ') Do (
    Set "InFile=%%~fA"
    Set "OutFile=!InFile:%~1=%~2!"
    gawk -f "%~dp0\fixXMP.awk" <"%%A" >"!OutFile!"
)

相关内容