Пакетный файл: вложенный If / else в цикле For - PullRequest
0 голосов
/ 11 мая 2018

Я пишу командный файл, который будет искать в каталоге файлы .jpg размером более 25 КБ, а затем запустит команду для сжатия этих файлов.

В настоящее время команда сжимает каждый файл .jpg, когда я запускаю его для всего каталога, но я изо всех сил пытаюсь заставить команду работать только для файлов размером более 25 КБ в указанном каталоге.Код ниже:

@echo off
SETLOCAL EnableDelayedExpansion
SET maxbytesize=25000
SET logfile=A:\JobLogs\PhotoCompression.log
ECHO Starting compression job at %date% %time% >> %logfile%
:: Runs the following if/else statement against all files in the directory
FOR %%G IN (C:\My\Directory) DO (
    :: If file size is greater than or equal to 25Kb, run the ImageMagick command and append the name of the processed file to logfile
    IF [ %var% GTR %maxbytesize% ] 
        magick mogrify -resize "140>^" -quality 75% -depth 8 -units PixelsPerInch -density 72x72 -strip *.jpg
        ECHO %%G has been compressed %date% %time% >> %logfile%
    :: No files are larger than 25Kb, write "All files are compressed" to logfile
    ELSE ECHO All files are compressed %date% %time% >> %logfile%
    )
:: Appends completed job status to logfile
ECHO Job is complete %date% %time% >> %logfile%
Exit

Команда "magick mogrify -resize" 140> ^ "-quality 75% -depth 8 -units PixelsPerInch -density 72x72 -strip * .jpg" является командой ImageMagick и можетигнорировать, поскольку он успешно сжимает фотографии при запуске по всему каталогу, как указано выше.

Обратите внимание, что я пробовал варианты% G, %% G,% G% и% var% в условии ifбезуспешно.

1 Ответ

0 голосов
/ 11 мая 2018
  • Не использовать (псевдо) метки :: внутри цикла for (кодовый блок).если необходимо использовать rem
  • , то переменная цикла for ~z возвращает размер файла в байтах

:: Q:\Test\2018\05\10\SO_50281887.cmd
@echo off
SETLOCAL EnableDelayedExpansion
SET maxbytesize=25000
SET logfile=A:\JobLogs\PhotoCompression.log
ECHO Starting compression job at %date% %time% >> %logfile%

FOR /R "C:\My\Directory\" /D %%G IN (*
) DO Call :CheckFiles "%%~fG" || (
    PushD "%%~fG"
    magick mogrify -resize "140>^" -quality 75% -depth 8 -units PixelsPerInch -density 72x72 -strip "*.jpg"
    ECHO %%G has been compressed %date% %time% >> %logfile%
    PopD
)
:: Appends completed job status to logfile
ECHO Job is complete %date% %time% >> %logfile%
Exit

:CheckFiles
For %%F in (%~1\*.jpg) Do If %%~zF GTR %maxbytesize% Exit /B 1
:: No files are larger than 25Kb,
ECHO All files in %~1 are smaller than %maxbytesize% %date% %time% >> %logfile%
  • Этот пакет повторяет все (sub-)Папки с начала и
  • вызывает подпрограмму, которая проверяет все * .jpg там
  • , если только одна больше, чем maxbytesize, возвращает ошибку, которая
  • вызывает команду magick черезусловное исполнение.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...