Windows 在条件为True时对文件执行命令

Windows 在条件为True时对文件执行命令,windows,batch-file,Windows,Batch File,上面的代码应该检查文件夹中的所有图像,如果大于240KB,则调整其大小,直到其大小小于240KB,然后处理到下一个文件 但它不起作用:(goto命令中断循环。使用例程包含goto子循环。 对于(.\*.jpg)中的%%a执行@if%%~za gtr 245760(调用:WhileD“%%~a”),否则在此处回显添加移动命令。 退出/b0 :呜呜 调整大小/覆盖/宽度:imagewidth-100%1%~n1.jpg 如果%%z1全球技术法规245760转到WhileD 退出/b0 更新 增加

上面的代码应该检查文件夹中的所有图像,如果大于240KB,则调整其大小,直到其大小小于240KB,然后处理到下一个文件

但它不起作用:(

goto
命令中断循环。使用例程包含
goto
子循环。
对于(.\*.jpg)中的%%a执行@if%%~za gtr 245760(调用:WhileD“%%~a”),否则在此处回显添加移动命令。
退出/b0
:呜呜
调整大小/覆盖/宽度:imagewidth-100%1%~n1.jpg
如果%%z1全球技术法规245760转到WhileD
退出/b0
更新
  • 增加了其他条件
试试这个

for %%a in (.\*.jpg) do @if %%~za gtr 245760 ( call :WhileD "%%~a" ) else echo add move command here.
exit /b 0

:WhileD <File>
resize /overwrite /width:imagewidth-100 %1 %~n1.jpg
if %~z1 gtr 245760 goto WhileD
exit /b 0

这应该可以解决问题。

%%a在
:WhileD
中不可见,当使用
call:WhileD
进行调用时,是否有任何方法在第1行中添加else命令?例如:对于%%a in(.*.jpg)do@if%%~za gtr 245760调用:WhileD“%%~a”else移动它;我尝试了它,但它不起作用:(我的意思是else不起作用是的,else命令可以起作用。您只需在if部分周围加上括号即可提供范围边界。
对于(.\*.jpg)中的%%a,执行@if%%~za gtr 245760(调用:WhileD“%%~a”)else echo add move it command here
注意,
CHECKFILE
中的
for
命令和第二个参数
%2
是不需要的。数值变量支持。谢谢David,我以前没有意识到,通过在for循环中使用goto,for命令每次都会从文件列表的开头开始。M如果文件夹有大量文件,则需要大量额外处理。@DavidRuhmann:当然。我的目标是简单。我不确定额外重新扫描目录是否会显著增加总体执行时间,如果目标驱动器是FAT而不是NTFS,我更喜欢这种方法。在FAT驱动器上,我建议使用
 对于/f…dir
方法,以确保整个目录扫描一次,而对于文件掩码中的%%x的
则不那么可靠。这种方法,以重新扫描目录的成本(实际上相当快)而言,适合NTFS和FAT.YMMV。
for %%a in (.\*.jpg) do @if %%~za gtr 245760 ( call :WhileD "%%~a" ) else echo add move command here.
exit /b 0

:WhileD <File>
resize /overwrite /width:imagewidth-100 %1 %~n1.jpg
if %~z1 gtr 245760 goto WhileD
exit /b 0
FOR %%A IN (*.jpg) DO CALL :CHECKFILE %%A %%~nA
EXIT /B 0

:CHECKFILE
FOR /F "usebackq" %%A IN ('%1') DO SET FSIZE=%%~zA
IF %FSIZE% LEQ 245760 EXIT /B 0
resize /overwrite /width:imagewidth-100 %1 %2.jpg
GOTO CHECKFILE
:WhileD
for %%a in (.\*.jpg) do if %%~za gtr 245760 (
          resize /overwrite /width:imagewidth-100 %%a %%~na.jpg
          goto WhileD
)