如何让批处理等待文件复制完成后再执行图片缩放操作
修复方案
核心原理
文件被复制过程中会被系统锁定,无法执行重命名/写入操作,我们可以利用这个特性判断文件是否已经完成复制,同时增加执行结果校验避免误删源文件。
修改后的主批处理代码
@echo off set "source_folder=c:\src" set "result_folder_1=c:\res1" :start if exist "%source_folder%\*.jpg" ( for %%a in ("%source_folder%\*.jpg") do ( :: 检测文件是否被占用 2>nul ( ren "%%~fa" "%%~nxa" if not errorlevel 1 ( call scale.bat -source "%%~fa" -target "%result_folder_1%\%%~nxa" -max-height 1000 -max-width 1000 -keep-ratio yes -force yes :: 仅缩放成功后删除源文件 if not errorlevel 1 ( del "%%~fa" ) ) ) ) ) :: 降低CPU占用 timeout /t 1 /nobreak >nul goto start
关键修改说明
- 文件占用校验:用
ren "%%~fa" "%%~nxa"尝试将文件重命名为自身,无报错则说明文件未被占用、复制完成,跳过还在写入的文件等待下一轮检测 - 执行结果校验:只有scale.bat正常执行完成(返回退出码0)才删除源文件,避免缩放失败时丢失原始文件
- 循环延迟:增加1秒无操作等待,大幅降低死循环带来的CPU占用,不影响监听响应速度
可选:修复scale.bat隐藏bug
当前scale.bat中格式转换逻辑存在顺序错误,会导致跨格式转换时出现变量未定义报错,修改方法如下:
找到scale.bat末尾的这几行代码:
/// scale(); /// if (sourceFormat !== targetFormat ){ convert(resImg,targetFormat); } var resImg=imageProcess.Apply(imageFile); resImg.SaveFile(target);
调整为如下顺序即可:
/// scale(); /// var resImg=imageProcess.Apply(imageFile); if (sourceFormat !== targetFormat ){ convert(resImg,targetFormat); resImg=imageProcess.Apply(resImg); } resImg.SaveFile(target);
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

