我的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
我不确定如何解决这个问题,希望能得到一些指导。
答案 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
)并附加到JPG
或destdir
中的输出目录名,并创建目录。 destdir2
会抑制错误消息,例如目标目录已存在时。
然后我们执行2>nul
。