Batch file 批处理脚本-比较2个图片目录,仅复制不存在的文件并调整其大小

Batch file 批处理脚本-比较2个图片目录,仅复制不存在的文件并调整其大小,batch-file,Batch File,我有两个jpg图片目录(大约15000个文件),%source%和%target%,每个目录都有子目录: %source%是我保存文件完整分辨率的目录 %target%是我希望将相同文件保存在%target%中的目录,但在某些参数中调整了大小 我不断地在%source%中添加文件,我需要在一周内用批处理文件“同步”两个目录几次 我曾想过这样做: 比较%source%和%target%并找到新文件 在%temp\u dir%中复制新文件(每个文件及其子目录),或创建文件的完整路径并将其复制到

我有两个jpg图片目录(大约15000个文件),
%source%
%target%
,每个目录都有子目录:

  • %source%
    是我保存文件完整分辨率的目录
  • %target%
    是我希望将相同文件保存在%target%中的目录,但在某些参数中调整了大小
我不断地在
%source%
中添加文件,我需要在一周内用批处理文件“同步”两个目录几次

我曾想过这样做:

  • 比较
    %source%
    %target%
    并找到新文件
  • %temp\u dir%
    中复制新文件(每个文件及其子目录),或创建文件的完整路径并将其复制到
  • 使用irfanview调整文件大小
  • 将调整大小的jpg文件从
    %temp\u dir%
    移动到%target%

  • 执行此操作的好方法是什么?

    这里您需要替换注释掉的命令以满足您的需要

    set "s=%source%"
    set slen=0
    :start
        set "s=%s:~1%"
        set /a slen += 1
    if defined s goto start
    
    SetLocal EnableDelayedExpansion
    
    for /f "delims=" %%S in ('dir /a-d /b /s "%source%"') do (
        set "srcfile=%%S"
        set "file=!srcfile:~%slen%!"
        set "tgtfile=%target%!file!"
    
        if not exist "!tgtfile!" (
            set "srcdir=%%~dpS"
            set "tgtdir=%target%!srcdir:~%slen%!"
            md "!tgtdir!" 2>nul
    
            REM   REPLACE THESE COMMANDS
            REM copy "!srcfile!" "!tgtdir!"
            REM resize.exe "!tgtfile!"
        )
    )
    

    我很抱歉,但目前我对批处理脚本的有限知识不允许我理解(并因此调整/修改)gordon创建的脚本,我想再次感谢他从头开始编写脚本

    我以这种方式重新组织,排除了临时目录并使用robocopy:

    @echo off
    
    set source=C:\source
    set target=D:\target
    
    robocopy /E /XO /PURGE /njh /njs /ndl /nc /ns %source% %target%
    
    for /r "%target%" %%f in (*.jpg) do (
        if %%~zf gtr 1048576 (
    
            irfanview.exe "%%f" /resize_short=1024 /aspectratio /resample /convert="%%f"
    
        )
    )
    
    exit
    
    看起来一切都很正常,脚本复制(或删除)了%source%和%target%之间的差异,并且只转换大小超过1mb的jpg文件。
    可以吗?

    很抱歉这么晚了,我在业余时间做这件事

    我想详细解释一下我在用这个脚本做什么,如果它对某人有用的话。 目前,我的台式电脑中有大约60gb的图片,出于工作原因,我想在我的智能手机中也有一些这样的图片

    我电脑中的图片文件夹包含10-11个主目录及其子文件夹,但我只想在智能手机中保留7-8个文件夹+子文件夹

    我不断更新和修改计算机文件夹,并且:

    • 我不想使用云或网络相关的解决方案
    • 我不想用智能手机管理太多GB
    • 我不想用智能手机管理7-8-10-15mb.jpg文件
    这是我的最终解决方案

    echo Please insert the smarthpone drive letter
    explorer
    set /p drive=   
    
    set irfan=C:\path\to\i_view64.exe
    set source=C:\my\pics\folder
    set target=%drive%:\Pics
    set dir1=projects
    set dir2=computers
    set dir3=stuff
    set dir4=etc...
    
    echo Synchronizing directory "%dir1%"...
    robocopy /E /XO /PURGE /njh /njs /ndl /nc /ns *.jpg *.jpeg *.png *.gif "%source%\%dir1%" "%target%\%dir1%" /xf *.dthumb *.nomedia
    for /r "%target%\%dir1%" %%f in (*.jpg) do (
        if %%~zf gtr 1048576 (
    
            echo Resizing file "%%f"
            %irfan% "%%f" /resize_short=1024 /aspectratio /resample /convert="%%f"
    
        )
    )
    echo "%dir1%" processing done!
    
    echo Synchronizing directory "%dir2%"...
    robocopy /E /XO /PURGE /njh /njs /ndl /nc /ns *.jpg *.jpeg *.png *.gif "%source%\%dir2%" "%target%\%dir2%" /xf *.dthumb *.nomedia
    for /r "%target%\%dir2%" %%f in (*.jpg) do (
        if %%~zf gtr 1048576 (
    
            echo Resizing file "%%f"
            %irfan% "%%f" /resize_short=1024 /aspectratio /resample /convert="%%f"
    
        )
    )
    echo "%dir2%" processing done!
    
    etc...
    
    此解决方案似乎非常适合我的需要:

    • 我可以管理驱动器号(如果其他存储设备连接到电脑)
    • 仅同步*.jpg*.jpeg*.png*.gif文件,并%目标%排除Android gallery缓存和系统文件。 如果在源或目标中删除了文件或文件夹,则没有问题
    • 仅为1mb over.jpg文件调整大小(irfan.exe使用这些命令将图片的短边调整为1024px,保持比例不变)
    • 在同步过程中,smartphone MicroSD空间被保留,并对每个目录重复调整大小操作

    唯一的问题是Android stock gallery应用程序,它没有按逻辑顺序显示子文件夹…我解决了这个小问题,安装QuickPick,一个允许高级配置的替代Android gallery,使用正确的设置显示每个文件夹的完整路径。

    到目前为止您尝试了什么?请共享您的代码!我们不会为你做你的工作,我们在这里帮助你解决你遇到的特定编程问题;看看……嗨,aschipfl,我尝试了一些解决方案,但我对批处理脚本的了解不是很深入。到目前为止,我只找到了将目录与robocopy同步的方法,以及如何调整文件大小。我用h我的问题不是让别人完成一项工作,而是看我的方法是否正确。这不是知识的问题…只是通过在你的帖子中包含代码来展示你有什么,描述它应该做什么,以及你有什么问题;请为我写代码。问题与主题无关,但操作经验不好,当然不是rse…不,对不起,我的开场白可能模棱两可,我在这里学习,而不是寻找填鸭式。谢谢你的建议:)无论如何,你应该发布你的尝试(例如,你提到的
    robocy
    命令行);您还应该说明将要使用的
    i_view32.exe
    命令行;您还应该澄清,如果从源位置删除了文件(因此目标目录包含一个孤立文件),该怎么办…感谢gordon的帮助,我正在努力理解您的代码,正如我之前所说,我没有那么丰富的经验。是的,这似乎比我的解决方案简单得多。更好的做法是将
    robocy
    for
    替换为:
    for/f“tokens=*”%%f in('robocy/E/XO/PURGE/njh/njs/ndl/nc/ns/np”%source%”“%target“')do irfanview.exe“%%f”/resize\u short=1024/aspectratio/resample/convert=“%%f”
    。这只会调整已移动/复制的图片的大小。我会尽快检查此建议,谢谢@gordon