Batch file 尝试使用Imagemagick';s Mogrify在保留/克隆原始目录的同时批量调整JPG大小

Batch file 尝试使用Imagemagick';s Mogrify在保留/克隆原始目录的同时批量调整JPG大小,batch-file,imagemagick,image-resizing,mogrify,Batch File,Imagemagick,Image Resizing,Mogrify,我正在尝试创建一个非常大数量照片的大小调整副本,同时保留它们来自的目录结构。以下是我目前掌握的情况: cd /d J:\Photos_test for /r /d %%a in (*) do magick mogrify -path "J:\Resized_test" -resize 1920x1080^> "%%~a\*.jpg" 这将获取在J:\Photos\u test子目录中找到的任何JPG,并在J:\resized\u test中创建一个调整大小的副本 我要做的是在执行调整大小

我正在尝试创建一个非常大数量照片的大小调整副本,同时保留它们来自的目录结构。以下是我目前掌握的情况:

cd /d J:\Photos_test
for /r /d %%a in (*) do magick mogrify -path "J:\Resized_test" -resize 1920x1080^> "%%~a\*.jpg"
这将获取在
J:\Photos\u test
子目录中找到的任何JPG,并在
J:\resized\u test
中创建一个调整大小的副本

我要做的是在执行调整大小操作时重新创建源目录。因此,
J:\Photos\u test\2018-04-19\133\u PANA\P12345.JPG
将被调整大小并放置在
J:\resized\u test\2018-04-19\133\u PANA\P12345.JPG


我怎样才能做到这一点?

我无法测试代码的Imagemagick部分,因为我无法将其加载到我的工作pc上

基本上,我所做的是在尝试对该目录进行任何进一步处理之前,添加一个检查以查看该目录中是否存在JPG文件。如果目录中有JPG文件,则会从文件路径中删除第一个目录。然后,如果该目录不存在,它将创建该目录。最后它执行ImageMagick命令

@echo off
cd /d J:\Photos_test
REM get listing of folders
for /r /d %%G in (*) do (
    REM Check if there are jpg files in the folder
    IF EXIST "%%~G\*.jpg" (
        REM strip off the first directory from the input folder path and process the file
        REM The FOR variable %%I becomes the relative path. Folder Path minus the first directory.
        for /F "tokens=1* delims=\" %%H in ("%%~pG") do (
            REM If the folder does not exist create it.
            IF NOT EXIST "J:\Resized_test\%%I\" MD "J:\Resized_test\%%I\"
            magick mogrify -path "J:\Resized_test\%%I" -resize "1920x1080>" "%%~G\*.jpg"
        )
    )
)

好的,所以我让我哥哥帮了我一点忙。这就是他想到的:

@echo off
setlocal EnableDelayedExpansion
title Batch JPEG Resizer

:: SOURCE FOLDER GOES HERE (NO FINAL \)
set "jpg_source=J:\Photos"

:: DESTINATION FOLDER GOES HERE (NO FINAL \)
set "jpg_destination=J:\Resized"

:: IMAGE RESOLUTION TO CONVERT TO (UNLESS SOURCE RESOLUTION IS SMALLER)
set "image_resolution=1920x1080"

cd /d %jpg_source%
set "relative_path=%cd:~2%"
for /f %%l in ('Powershell $Env:relative_path.Length') do (set relative_path_len=%%l)
for /r %%b in (*.jpg *.jpeg) do (set /a "jpg_count+=1" & echo !jpg_count!)
pause

for /r %%a in (*.jpg *.jpeg) do (
    set /a "current_jpg_number+=1"
    set "current_relative_path=%%~pa"
    set "current_relative_path=!current_relative_path:~%relative_path_len%!"
    if not exist "%jpg_destination%!current_relative_path!" mkdir "%jpg_destination%!current_relative_path!"
    if not exist "%jpg_destination%!current_relative_path!%%~na%%~xa" magick convert "%%a" -resize %image_resolution%^> "%jpg_destination%!current_relative_path!%%~na%%~xa"
    echo Image !current_jpg_number! of !jpg_count!: %%a
)

pause
这似乎很管用!他添加了一些变量,以便将来修改,还包括一个计数器和状态读数。最后一件事是让计数器简单地替换和更新回显的jpg_计数编号,而不是每次将其写入新行。

最小解决方案:

copy.bat on the origin folder:

XCOPY /S/D *.jpg  S:\icons\ 

XCOPY /S/D *.jpeg S:\icons\ 
目标文件夹上的
resize.bat

FOR /R %%a IN (*.jpg) DO magick convert "%%~a" -resize 600x200 "%%~a" 

如果子目录中不存在文件,您不会出错吗。您为什么不直接使用文件掩码为
*.jpg
FOR/R
。我们可以向您展示如何创建相对路径,但您的代码似乎效率低下,因此修复它也更有意义。真的不明白为什么要转义吗?我在“我理解转义的>”上没有看到
-path
选项。但是你不应该像网上的例子说的那样引用这个论点<代码>-调整“1920x1080>”我从另一个示例中复制并改编了这个示例,其中有人试图从文件夹和子文件夹中获取JPG,并将其转换为另一个文件夹中的PNG。我确实收到了以下错误,但它确实复制并调整了子文件夹中的jpg的大小:
mogrify:无法打开图像'J:\Photos\u test\2017-11-01\*.jpg':无效参数@error/blob.c/OpenBlob/3375。
我对这方面不是很精通,我只是根据我能找到的例子摸索一下,所以我可能没有以最有效的方式做事。谢谢你的帮助!将其放入窗口标题:
标题图像!当前的jpg号码!属于jpg_计数!:%%a