我想使用这一行脚本在一个目录中的所有 *.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
输入文件
我看到两种可能的解决方案:
- 使用
forfiles
选项@RelPath
- 使用
for /f
解析的输出dir /B/S "%1\*.xmp"
,然后indir
在outdir
找到的驱动器:\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!"
)