使用bat和imagemagick镜像输出文件夹中的子目录

时间:2018-04-13 00:28:23

标签: windows batch-file imagemagick

我的BAT文件当前扫描“JPG”的所有子目录,并在将它们发送到“输出”之前对其中找到的所有文件执行imagemagick:

for /r /d %%a in (JPG\*) do magick convert "%%~a\*.jpg" resize 500000@ -set filename:out %%t_%%wx%%h "output/%%[filename:out].jpg"

我希望能够在“输出”中镜像“JPG”的文件夹结构,例如。

JPG/dir1/*.jpg
JPF/dir2/*.jpg

output/dir1/*.jpg
output/dir2/*.jpg

我不确定如何解决这个问题,希望能得到一些指导。

1 个答案:

答案 0 :(得分:0)

for /f "delims=" %%a in ('xcopy /L /S /Y "JPG\*" "output\" ^|findstr /v /e /L /i /c:" file(s)" ') do magick convert "%%~a" resize 500000@ -set filename:out %%t_%%wx%%h "output\%%~na.jpg"

这会生成 /L及其子目录(jpg)复制的文件列表(/S) - {{1}跳过默认提示。然后,通过/Y - %%a子句将此列表(源文件)分配给for/f,确保分配整个名称,而不管分隔符如何定义要用作分隔符的分隔符没有

请注意,我不熟悉delims命令的复杂性 - magick应该提供完整的文件名; %%a仅限名称部分(即没有路径且没有扩展名)

此外,Windows中的路径用反斜杠表示,而不是%%~na。转换不可靠,因为/用于表示切换。

[edit:添加了/命令,以消除findstr文字" 空间文件中/e结尾的输出行&# 34; /L不区分大小写的情况下

进一步的想法:

/i

我通常完全指定源目录和目标目录。

上面的代码应该获取源目录中的文件,并根据所选的文件掩码为找到的每个文件生成三个单独的输出集。建议的命令只是@ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION SET "destdir=U:\destdir" SET "destdir2=destdir" for /f "delims=" %%a in ('xcopy /L /S /Y "JPG\*" "output\" ^|findstr /v /e /L /i /c:" file(s)" ') DO ( ECHO magick convert "%%~a" resize 500000@ -set filename:out %%t_%%wx%%h "output\%%~na.jpg" SET "outdir=%%~a" SET "outdir=!outdir:\%%~nxa=!" SET "outdir=%destdir%!outdir:~3!" ECHO MD "!outdir!" 2>nul ECHO magick convert "%%~a" resize 500000@ -set filename:out %%t_%%wx%%h "!outdir!\%%~na.jpg" SET "outdir=%%~a" SET "outdir=!outdir:\%%~nxa=!" SET "outdir=%destdir2%!outdir:~3!" ECHO MD "!outdir!" 2>nul ECHO magick convert "%%~a" resize 500000@ -set filename:out %%t_%%wx%%h "!outdir!\%%~na.jpg" ECHO ================== ) GOTO :EOF ,以便适当选择所需的结果。

第一组使用原始代码 - 没有惊喜。

第二组和第三组建立一个名为echo的变量,其中包含源文件名。由于不允许对元变量进行子字符串处理,因此将值传递给普通的环境变量,并调用outdir以允许在代码块中操作值。

首先,删除最后的反斜杠,名称和扩展名,留下路径。然后删除前3个字符(delayedexpansion)并附加到JPGdestdir中的输出目录名,并创建目录。 destdir2会抑制错误消息,例如目标目录已存在时。

然后我们执行2>nul