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