1 (изменено: lorents, 2012-01-30 23:34:55)

Тема: CMD/BAT: Image Catalyst

Добрый день!
Я являюсь одним из разработчиков проекта Image Catalyst. Суть проекта - оптимизация/сжатие изображений формата PNG и JPEG без потери качества в рамках того же формата. Как происходит оптимизация можно ознакомится здесь.

Сам проект состоит из приложений по оптимизации и самого batch (на счет batch и хотел поговорить). Отличительная особенность batch в том, что в нем реализована многопоточность для оптимизации PNG, что в свою очередь в разы ускоряет процесс оптимизации.

Хочу попросить участников форма посмотреть на batch и высказать свое мнение и, при возможности, дать советы

Вот ссылка на последнюю версию проекта http://rghost.ru/36228331

@echo off
>nul chcp 866

::Lorents & Res2001 2010-2012

setlocal enabledelayedexpansion
if "%~1" equ "thrt" call:threatwork "%~2" %3 %4 & exit /b
if "%~1" equ "updateic" call:icupdate & exit /b

set "name=Image Catalyst"
set "version=2.2"
title [Loading] %name% %version%

set "fullname=%~0"
set "scrpath=%~dp0"
set "sconfig=%scrpath%tools\"
set "scripts=%scrpath%tools\scripts\"
set "tmppath=%TEMP%\Image Catalyst\%random%"

if exist "%systemroot%\system32\tasklist.exe" (
    for /f "tokens=* delims=" %%a in ('tasklist /v /fi "imagename eq cmd.exe" ^| find /c "%name%" ') do (
        if %%a equ 1 if exist "%TEMP%\Image Catalyst\" rd /s /q "%TEMP%\Image Catalyst\"
    )
)

set "apps=%~dp0Tools\apps\"
PATH %apps%;%PATH%
if not exist "%apps%advdef.exe" set "nofile=%nofile%advdef.exe "
if not exist "%apps%deflopt.exe" set "nofile=%nofile%deflopt.exe "
if not exist "%apps%defluff.exe" set "nofile=%nofile%defluff.exe "
if not exist "%apps%initool.exe" set "nofile=%nofile%initool.exe "
if not exist "%apps%jhead.exe" set "nofile=%nofile%jhead.exe "
if not exist "%apps%jpegtran.exe" set "nofile=%nofile%jpegtran.exe "
if not exist "%apps%pngout.exe" set "nofile=%nofile%pngout.exe "
if not exist "%apps%touch.exe" set "nofile=%nofile%touch.exe "
if not exist "%apps%truepng.exe" set "nofile=%nofile%truepng.exe "
if not exist "%apps%zlib.dll" set "nofile=%nofile%zlib.dll "
if not exist "%sconfig%config.ini" set "nofile=%nofile%config.ini "
if not exist "%scripts%jpeg_scan_rgb.txt" set "nofile=%nofile%jpeg_scan_rgb.txt "
if not exist "%scripts%jpeg_scan_bw.txt" set "nofile=%nofile%jpeg_scan_bw.txt "
if not exist "%scripts%xmlhttprequest.js" set "nofile=%nofile%xmlhttprequest.js "
if defined nofile (
    title [Error] %name% %version%
    echo ───────────────────────────────────────────────────────────────────────────────
    echo  Приложение не смогло получить доступ к следующим файлам:
    echo.
    for %%j in (%nofile%) do echo  - %%j
    echo.
    echo  Для выхода из приложения нажмите на Enter.
    echo ───────────────────────────────────────────────────────────────────────────────
    pause>nul &    goto:eof
)

set "ImageNumPNG=0"
set "ImageNumJPG=0"
set "TotalNumPNG=0"
set "TotalNumJPG=0"
set "TotalSizeJPG=0"
set "ImageSizeJPG=0"
set "TotalSizePNG=0"
set "ImageSizePNG=0"
set "changePNG=0"
set "percPNG=100"
set "changeJPG=0"
set "percJPG=100"
set "png="
set "jpeg="

set "updateurl=http://x128.ho.ua/update.ini"
set "configpath=%~dp0\Tools\config.ini"
set "logfile=%tmppath%\Images.csv"
set "iculog=%tmppath%\icu.log"
set "iculck=%tmppath%\icu.lck"
set "countPNG=%tmppath%\countpng"
set "countJPG=%tmppath%\countjpg"

for /f "tokens=*" %%i in ('initool /f:"%configpath%" /s:"options" /k:"fs" ') do if /i "%%~i" equ "true" set "fs=/s"
for /f "tokens=*" %%i in ('initool /f:"%configpath%" /s:"options" /k:"threatpng" ') do call:sethreat %%~i & set "threatpng=!threat!" & set "threat="
for /f "tokens=*" %%i in ('initool /f:"%configpath%" /s:"options" /k:"update" ') do set "updatecheck=%%i"

set "sec-jpeg="
for /f "tokens=*" %%i in ('initool /f:"%configpath%" /s:"jpeg" /k:"ft" ') do if /i "%%~i" equ "true" set "ft=-ft"
for /f "tokens=1" %%i in ('initool /f:"%configpath%" /s:"jpeg" /k:"dc" ') do if /i "%%~i" equ "true" set "sec-jpeg=-dc"
for /f "tokens=1" %%i in ('initool /f:"%configpath%" /s:"jpeg" /k:"de" ') do if /i "%%~i" equ "true" set "sec-jpeg=%sec-jpeg% -de"
for /f "tokens=1" %%i in ('initool /f:"%configpath%" /s:"jpeg" /k:"di" ') do if /i "%%~i" equ "true" set "sec-jpeg=%sec-jpeg% -di"
for /f "tokens=1" %%i in ('initool /f:"%configpath%" /s:"jpeg" /k:"dx" ') do if /i "%%~i" equ "true" set "sec-jpeg=%sec-jpeg% -dx"
for /f "tokens=1" %%i in ('initool /f:"%configpath%" /s:"jpeg" /k:"du" ') do if /i "%%~i" equ "true" set "sec-jpeg=%sec-jpeg% -du"

for /f "tokens=*" %%i in ('initool /f:"%configpath%" /s:"png" /k:"na" ') do set na=%%i
for /f "tokens=*" %%i in ('initool /f:"%configpath%" /s:"png" /k:"nc" ') do if /i "%%~i" equ "false" set "nc=-nc"
for /f "tokens=*" %%i in ('initool /f:"%configpath%" /s:"png" /k:"chunks" ') do set chunks=%%i

set "threatjpg=1"
if %threatpng% equ 1 (set "multithreat=0") else set "multithreat=1"

if "%~1" neq "" (
    set "params=%*"
) else (
    title [Manual] %name% %version%
    echo ───────────────────────────────────────────────────────────────────────────────
    echo  Оптимизировать изображения формата PNG и JPEG можно следующими способами:
    echo  1. перенесите файлы и/или папки с файлами на иконку "Image Catalyst.bat";
    echo  2. запустите "Image Catalyst.bat" с параметрами "файл/папка с файлами".
    echo.
    echo  Настоятельно рекомендуется перед оптимизацией изучить справку ^(ReadMe.txt^)
    echo  Для выхода из приложения нажмите на Enter.
    echo ───────────────────────────────────────────────────────────────────────────────
    pause>nul & exit
)

for %%a in (%params%) do (
    call:initsource "%%~a"
    if defined ispng (
        if not defined isfolder (
            set /a "TotalNumPNG+=1"
        ) else (
            for /f "delims=" %%i in ('dir /b %fs% /a-d-h "%%~a\*.png" 2^>nul ^| find /c /v "" ') do set /a "TotalNumPNG+=%%i"
        )
    )
    if defined isjpeg (
        if not defined isfolder (
            set /a "TotalNumJPG+=1"
        ) else (
            for /f "delims=" %%i in ('dir /b %fs% /a-d-h "%%~a\*.jpg" "%%~a\*.jpeg" "%%~a\*.jpe" 2^>nul ^| find /c /v "" ') do set /a "TotalNumJPG+=%%i"
        )
    )
)

if "%TotalNumPNG%" equ "0" set "multithreat=0"
set "params1="
for %%a in (%params%) do (
    set "err="
    1>nul 2>nul dir "%%~a" || (
        title [Error] %name% %version%
        echo ───────────────────────────────────────────────────────────────────────────────
        echo  Указанный путь к папке или файлу не найден.
        echo  Для выхода из приложения нажмите на Enter.
        echo ───────────────────────────────────────────────────────────────────────────────
        set "err=1"
        pause>nul & exit
    )
    if not defined err (
        call:initsource "%%~a"
        if not defined ispng if not defined isjpeg set "err=2"
        if not defined err (
            if defined ispng if not defined png call:png "%%~a"
            if defined isjpeg if not defined jpeg call:jpeg "%%~a"
            set "params1=!params1! %%a"
        )
    )
)

if not defined params1 (
    title [Error] %name% %version%
    echo ───────────────────────────────────────────────────────────────────────────────
    echo  Файлы формата PNG и JPEG не найдены.
    echo  Для выхода из приложения нажмите на Enter.
    echo ───────────────────────────────────────────────────────────────────────────────
    pause>nul & exit
)

if not exist "%tmppath%" 1>nul 2>&1 md "%tmppath%"
1>nul 2>&1 del /f /q "%tmppath%\*"
if "%png%" equ "0" set "multithreat=0"
if %multithreat% neq 0 >"%logfile%" echo.
if not defined png set "png=0"
if not defined jpeg set "jpeg=0"

cls
if /i "%na%" equ "false" (
    set "na=-na"
) else (
    if %png% equ 1 set "na=-a1"
    if %png% equ 2 set "na=-a0"
    if %png% equ 3 set "na=-a1"
    if %png% equ 4 set "na=-a0"
    if %png% equ 5 set "na=-a1"
    if %png% equ 6 set "na=-a0"
)
echo _______________________________________________________________________________
echo.
call:setitle
if /i "%updatecheck%" equ "true" start "" /b cmd.exe /c ""%fullname%" updateic"
set stime=%date% %time:~0,2%:%time:~3,2%:%time:~6,2%
for %%a in (%params1%) do (
    call:initsource "%%~a"
    if defined ispng if "%png%" neq "0" call:pngwork "%%~a"
    if defined isjpeg if "%jpeg%" neq "0" call:jpegwork "%%~a"
)

:waithreat
set "thrt="
for /l %%z in (1,1,%threatpng%) do if exist "%tmppath%\thrtpng%%z.lck" (set "thrt=1") else call:typelog & call:setitle
for /l %%z in (1,1,%threatjpg%) do if exist "%tmppath%\thrtjpg%%z.lck" (set "thrt=1") else call:typelog & call:setitle
if defined thrt >nul 2>&1 ping -n 1 -w 500 127.255.255.255 & goto:waithreat
call:end
pause>nul & exit /b

:icupdate
if not exist "%scripts%xmlhttprequest.js" exit /b
>"%iculck%" echo.Update IC
cscript //nologo //E:JScript "%scripts%xmlhttprequest.js" %updateurl% 2>nul 1>"%iculog%" || 1>nul 2>&1 del /f /q "%iculog%"
1>nul 2>&1 del /f /q "%iculck%"
exit /b

:createthreat
if %2 equ 1 call:threatwork "%~3" %1 1 & call:typelog & exit /b
for /l %%z in (1,1,%2) do (
    if not exist "%tmppath%\thrt%1%%z.lck" (
        call:typelog
        >"%tmppath%\thrt%1%%z.lck" echo Обработка файла: %~3
        start "" /b cmd.exe /c ""%fullname%" thrt "%~3" %1 %%z "
        exit /b
    )
)
1>nul 2>&1 ping -n 1 -w 500 127.255.255.255
goto:createthreat

:typelog
if %multithreat% equ 0 exit /b
if exist "%tmppath%\typelog.lck" exit /b 
>"%tmppath%\typelog.lck" echo.typelog %typenum%
if not defined typenum set "typenum=1"
for /f "usebackq skip=%typenum% tokens=1-5 delims=;" %%b in ("%logfile%") do (
    if "%%d" equ "" (
        echo  File  - "%%~b"
        echo  Error - %%c
    ) else (
        echo  File  - "%%~b"
        echo  In    - %%c байт
        echo  Out   - %%d байт ^(%%e байт, %%f%%^)
    )
    echo _______________________________________________________________________________
    echo.
    set /a "typenum+=1"
)
1>nul 2>&1 del /f /q "%tmppath%\typelog.lck"
exit /b

:threatwork
if /i "%2" equ "png" call:pngfilework %1 %3 & call:countplus "%countPNG%"
if /i "%2" equ "jpg" call:jpegfilework %1 %3
if exist "%tmppath%\thrt%2%3.lck" >nul 2>&1 del /f /q "%tmppath%\thrt%2%3.lck"
exit /b

:countplus
if %multithreat% equ 0 exit /b
call:waitflag "%~1.lck"
>"%~1.lck" echo.%~1
>>"%countPNG%" echo.1
1>nul 2>&1 del /f /q "%~1.lck"
exit /b

:waitflag
if exist "%~1" (1>nul 2>&1 ping -n 1 -w 500 127.255.255.255 & goto:waitflag)
exit /b 0

:initsource
set "isjpeg="
set "ispng="
set "isfolder="
1>nul 2>nul dir /ad "%~1" && set "isfolder=1"
if not defined isfolder (
    if /i "%~x1" equ ".png" set "ispng=1"
    if /i "%~x1" equ ".jpg" set "isjpeg=1"
    if /i "%~x1" equ ".jpeg" set "isjpeg=1"
    if /i "%~x1" equ ".jpe" set "isjpeg=1"
) else (
    1>nul 2>nul dir /b %fs% /a-d-h "%~1\*.png" && set "ispng=1"
    1>nul 2>nul dir /b %fs% /a-d-h "%~1\*.jpg" "%~1\*.jpeg" "%~1\*.jpe" && set "isjpeg=1"
)
exit /b

:sethreat
if "%~1" equ "" (set "threat=%NUMBER_OF_PROCESSORS%") else (
    set /a "threat=%~1+1-1"
    if "!threat!" equ "0" set "threat=%NUMBER_OF_PROCESSORS%"
)
exit /b

:png
title [PNG: %TotalNumPNG%] %name% %version%
echo  ─────────────────────────
echo  Параметр оптимизации PNG:
echo  ─────────────────────────
echo.
echo  Non-interlaced:
echo  [1] Xtreme    [2] Advanced
echo.
echo  Interlaced:
echo  [3] Xtreme    [4] Advanced
echo.
echo  Default:
echo  [5] Xtreme    [6] Advanced
echo.
echo  [0] Пропустить оптимизацию изображений формата PNG
echo.

:loop1
set png=
echo  ─────────────────────────────────────────────────────────────
set /p png="#Укажите параметр оптимизации PNG и нажмите на Enter [0-8]: "
echo  ─────────────────────────────────────────────────────────────
echo.
if "%png%" equ "" set "png=0"
if "%png%" equ "0" exit /b
if "%png%" neq "1" if "%png%" neq "2" if "%png%" neq "3" if "%png%" neq "4" if "%png%" neq "5" if "%png%" neq "6" if "%png%" neq "7" if "%png%" neq "8" (
    echo  ──────────────────────────────────────────────────────────────────
    echo  Error. Вы указали неправильное значение параметра оптимизации PNG.
    echo  ──────────────────────────────────────────────────────────────────
    echo.
    goto:loop1
)
exit /b

:jpeg
title [JPEG: %TotalNumJPG%] %name% %version%
echo  ──────────────────────────
echo  Параметр оптимизации JPEG:
echo  ──────────────────────────
echo.
echo  [1] Optimize    [2] Progressive
echo.
echo  [3] Maximum    [4] Default
echo.
echo  [0] Пропустить оптимизацию изображений формата JPEG
echo.

:loop2
set jpeg=
echo  ──────────────────────────────────────────────────────────────
set /p jpeg="#Укажите параметр оптимизации JPEG и нажмите на Enter [0-4]: "
echo  ──────────────────────────────────────────────────────────────
echo.
if "%jpeg%" equ "0" set "jpeg=0"
if "%jpeg%" equ "0" exit /b
if "%jpeg%" neq "1" if "%jpeg%" neq "2" if "%jpeg%" neq "3" if "%jpeg%" neq "4" (
    echo  ───────────────────────────────────────────────────────────────────
    echo  Error. Вы указали неправильное значение параметра оптимизации JPEG.
    echo  ───────────────────────────────────────────────────────────────────
    echo.
    goto:loop2
)
exit /b

:setitle
if "%jpeg%" equ "0" if "%png%" equ "0" (title %~1%name% %version% & exit /b)
if %multithreat% neq 0 (
    set "ImageNumPNG=0"
    for %%b in ("%countPNG%") do set /a "ImageNumPNG=%%~zb/3" 2>nul
)
if "%jpeg%" equ "0" (
    title %~1[PNG: %ImageNumPNG%/%TotalNumPNG%] %name% %version%
) else (
    if "%png%" equ "0" (
        title %~1[JPEG: %ImageNumJPG%/%TotalNumJPG%] %name% %version%
    ) else  (
        title %~1[PNG: %ImageNumPNG%/%TotalNumPNG%] [JPEG: %ImageNumJPG%/%TotalNumJPG%] %name% %version%
    )
)
exit /b

:pngwork
if defined isfolder (
    for /f "delims=" %%i in ('dir /b %fs% /a-d-h "%~1\*.png" ') do (
        call:createthreat png %threatpng% "%%~fi"
        set /a "ImageNumPNG+=1" & call:setitle
    )
) else (
    call:createthreat png %threatpng% "%~1"
    set /a "ImageNumPNG+=1" & call:setitle
)
exit /b

:pngfilework
set pnglog="%tmppath%\png%2.log"
1>nul 2>&1 copy /b /y "%~f1" "%tmppath%\%~nx1" || (call:saverrorlog "%~f1" "Не удается найти указанный файл" & exit /b)
attrib "%~f1" | 1>nul 2>&1 findstr /b /r ".....R" && (call:saverrorlog "%~f1" "Файл только для чтения" & exit /b)
truepng -info "%tmppath%\%~nx1" >%pnglog% 2>nul
find /i "The file being readed is not a valid" <%pnglog% 1>nul 2>&1 && (call:saverrorlog "%~f1" "Указанный файл не является форматом PNG" & exit /b)
find /i "apng" <%pnglog% >nul && (call:saverrorlog "%~f1" "Animated PNG" & exit /b)
if %multithreat% equ 0 for %%a in ("%~f1") do set /a "TotalSizePNG+=%%~za"
set "psize=%~z1"
if %png% equ 1 call:Non-interlaced-Xtreme "%tmppath%\%~nx1" >nul
if %png% equ 2 call:Non-interlaced-Advanced "%tmppath%\%~nx1" >nul
if %png% equ 3 call:Interlaced-Xtreme "%tmppath%\%~nx1" >nul & set "isinterlaced=1"
if %png% equ 4 call:Interlaced-Advanced "%tmppath%\%~nx1" >nul & set "isinterlaced=1"
if %png% gtr 4 (
    find /i "Interlaced" <%pnglog% >nul
    if errorlevel 1 (
        if %png% equ 5 call:Non-interlaced-Xtreme "%tmppath%\%~nx1" >nul
        if %png% equ 6 call:Non-interlaced-Advanced "%tmppath%\%~nx1" >nul
    ) else (
        if %png% equ 5 call:Interlaced-Xtreme "%tmppath%\%~nx1" >nul
        if %png% equ 6 call:Interlaced-Advanced "%tmppath%\%~nx1" >nul
    )
)
if %png% gtr 4 (
    call:backup "%~f1" "%tmppath%\%~nx1" >nul
) else (
    set "isinterlaced%2="
    find /i "Interlaced" <%pnglog% >nul && set "isinterlaced%2=1"
    if %png% lss 3 (
        if not defined isinterlaced%2 (
            call:backup "%~f1" "%tmppath%\%~nx1" >nul
        ) else (
            1>nul 2>&1 move /y "%tmppath%\%~nx1" "%~f1"
        )
    ) else (
        if defined isinterlaced%2 (
            call:backup "%~f1" "%tmppath%\%~nx1" >nul
        ) else (
            1>nul 2>&1 move /y "%tmppath%\%~nx1" "%~f1"
        )
    )
)
truepng -nz -md %chunks% "%~f1" >nul
deflopt -k "%~f1" >nul
defluff < "%~f1" > "%tmppath%\%~n1-defluff.png" 2>nul
1>nul 2>&1 move /y "%tmppath%\%~n1-defluff.png" "%~f1"
deflopt -k "%~f1" >nul
call:savelog "%~f1" !psize!
if %multithreat% equ 0 for %%a in ("%~f1") do set /a "ImageSizePNG+=%%~za"
del /f /q %pnglog% >nul
set "isinterlaced%2="
set "pnglog="
exit /b

:jpegwork
if defined isfolder (
    for /f "delims=" %%i in ('dir /b %fs% /a-d-h "%~1\*.jpg" "%~1\*.jpeg" "%~1\*.jpe" ') do (
        call:createthreat jpg %threatjpg% "%%~fi"
        set /a "ImageNumJPG+=1" & call:setitle
    )
) else (
    call:createthreat jpg %threatjpg% "%~1"
    set /a "ImageNumJPG+=1" & call:setitle
)
exit /b

:jpegfilework
1>nul 2>&1 copy /b /y "%~f1" "%tmppath%\%~nx1" || (call:saverrorlog "%~f1" "Не удается найти указанный файл" & exit /b)
1>"%tmppath%\%~n1.txt" 2>&1 jhead -v "%tmppath%\%~nx1"
find /i "Not JPEG:" <"%tmppath%\%~n1.txt" 1>nul 2>&1 && (call:saverrorlog "%~f1" "Указанный файл не является форматом JPEG" & exit /b)
find /i "Jpeg process" <"%tmppath%\%~n1.txt" >nul
if errorlevel 1 (
    set ep=Baseline
) else (
    find /i "Progressive" <"%tmppath%\%~n1.txt" 1>nul 2>&1 || (call:saverrorlog "%~f1" "Указанный файл не поддерживается" & exit /b)
    set ep=Progressive
)
if %multithreat% equ 0 for %%a in ("%~f1") do set /a "TotalSizeJPG+=%%~za"
set "jsize1=%~z1"
if %jpeg% equ 1 (
    jpegtran -copy all -optimize -perfect "%tmppath%\%~nx1" "%tmppath%\%~nx1"
    if /i "!ep!" equ "Baseline" (
        for %%j in ("%tmppath%\%~nx1") do set "jsize2=%%~zj"
        if !jsize1! leq !jsize2! (
            1>nul 2>&1 del /f /q "%tmppath%\%~nx1"
        ) else (
            touch -r "%~f1" "%tmppath%\%~nx1"
            1>nul 2>&1 move /y "%tmppath%\%~nx1" "%~f1"
            if errorlevel 1 call:saverrorlog "%~f1" "Файл только для чтения" & exit /b
        )
    )
    if /i "!ep!" equ "Progressive" (
        touch -r "%~f1" "%tmppath%\%~nx1"
        1>nul 2>&1 move /y "%tmppath%\%~nx1" "%~f1"
        if errorlevel 1 call:saverrorlog "%~f1" "Файл только для чтения" & exit /b
    )
)
if %jpeg% equ 2 (
    find /i "3 color components" <"%tmppath%\%~n1.txt" >nul
    if errorlevel 1 (set cm=bw) else (set cm=rgb)
    jpegtran -copy all -scans "%scripts%jpeg_scan_!cm!.txt" -perfect "%tmppath%\%~nx1" "%tmppath%\%~nx1"
    if /i "!ep!" equ "Baseline" (
        touch -r "%~f1" "%tmppath%\%~nx1"
        1>nul 2>&1 move /y "%tmppath%\%~nx1" "%~f1"
        if errorlevel 1 call:saverrorlog "%~f1" "Файл только для чтения" & exit /b
    )
    if /i "!ep!" equ "Progressive" (
        for %%j in ("%tmppath%\%~nx1") do set "jsize2=%%~zj"
        if !jsize1! leq !jsize2! (
            1>nul 2>&1 del /f /q "%tmppath%\%~nx1"
        ) else (
            touch -r "%~f1" "%tmppath%\%~nx1"
            1>nul 2>&1 move /y "%tmppath%\%~nx1" "%~f1"
            if errorlevel 1 call:saverrorlog "%~f1" "Файл только для чтения" & exit /b
        )
    )
)
if %jpeg% equ 3 (
    find /i "3 color components" <"%tmppath%\%~n1.txt" >nul
    if errorlevel 1 (set cm=bw) else (set cm=rgb)
    jpegtran -copy all -optimize -perfect "%tmppath%\%~nx1" "%tmppath%\%~nx1.opt"
    jpegtran -copy all -scans "%scripts%jpeg_scan_!cm!.txt" -perfect "%tmppath%\%~nx1" "%tmppath%\%~nx1.pro"
    for %%j in ("%tmppath%\%~nx1.opt") do set "jsize2=%%~zj"
    for %%j in ("%tmppath%\%~nx1.pro") do set "jsize3=%%~zj"
    if !jsize2! leq !jsize3! (
        1>nul 2>&1 move /y "%tmppath%\%~nx1.opt" "%tmppath%\%~nx1"
        1>nul 2>&1 del /f /q "%tmppath%\%~nx1.pro"
    ) else (
        1>nul 2>&1 move /y "%tmppath%\%~nx1.pro" "%tmppath%\%~nx1"
        1>nul 2>&1 del /f /q "%tmppath%\%~nx1.opt"
    )
    for %%j in ("%tmppath%\%~nx1") do set "jsize4=%%~zj"
    if !jsize1! leq !jsize4! (
        1>nul 2>&1 del /f /q "%tmppath%\%~nx1"
    ) else (
        touch -r "%~f1" "%tmppath%\%~nx1"
        1>nul 2>&1 move /y "%tmppath%\%~nx1" "%~f1"
        if errorlevel 1 call:saverrorlog "%~f1" "Файл только для чтения" & exit /b
    )
)
if %jpeg% equ 4 (
    if /i "!ep!" equ "Baseline" jpegtran -copy all -optimize -perfect "%tmppath%\%~nx1" "%tmppath%\%~nx1"
    if /i "!ep!" equ "Progressive" (
        find /i "3 color components" <"%tmppath%\%~n1.txt" >nul
        if errorlevel 1 (set cm=bw) else (set cm=rgb)
        jpegtran -copy all -scans "%scripts%jpeg_scan_!cm!.txt" -perfect "%tmppath%\%~nx1" "%tmppath%\%~nx1"
    )
    for %%j in ("%tmppath%\%~nx1") do set "jsize2=%%~zj"
    if !jsize1! leq !jsize2! (
        1>nul 2>&1 del /f /q "%tmppath%\%~nx1"
    ) else (
        touch -r "%~f1" "%tmppath%\%~nx1"
        1>nul 2>&1 move /y "%tmppath%\%~nx1" "%~f1"
        if errorlevel 1 call:saverrorlog "%~f1" "Файл только для чтения" & exit /b
    )
)
1>nul 2>&1 del /f /q "%tmppath%\%~n1.txt"
jhead %sec-jpeg% %ft% "%~f1" 1>nul 2>nul
call:savelog "%~f1" !jsize1!
if %multithreat% equ 0 for %%a in ("%~f1") do set /a "ImageSizeJPG+=%%~za"
set "ep="
set "cm="
exit /b

:backup
if %~z1 leq %~z2 (del /f /q %2) else (1>nul 2>&1 move /y %2 %1)
exit /b

:savelog
set /a "change=%~z1-%2"
set /a "perc=%~z1*100/%2"
if %multithreat% neq 0 (
    call:waitflag "%tmppath%\typelog.lck"
    >"%tmppath%\typelog.lck" echo.savelog %~1
    >>"%logfile%" echo.%~1;%2;%~z1;%change%;%perc%
    1>nul 2>&1 del /f /q "%tmppath%\typelog.lck"
) else (
    echo  File - "%~f1"
    echo  In   - %~z1 байт
    echo  Out  - %~z1 байт ^(%change% байт, %perc%%%^)
    echo _______________________________________________________________________________
    echo.
)
exit /b

:saverrorlog
1>nul 2>&1 del /f /q "%tmppath%\%~nx1"
if %multithreat% equ 0 (
    echo  File  - "%~f1"
    echo  Error - %~2
    echo _______________________________________________________________________________
    echo.
) else (
    call:waitflag "%tmppath%\typelog.lck"
    >"%tmppath%\typelog.lck" echo.saverrorlog %~1
    >>"%logfile%" echo.%~1;%~2
    1>nul 2>&1 del /f /q "%tmppath%\typelog.lck"
)
exit /b

:end
set ftime=%date% %time:~0,2%:%time:~3,2%:%time:~6,2%
call:setitle "[Finished] "
if "%jpeg%" equ "0" if "%png%" equ "0" 1>nul ping -n 1 -w 500 127.255.255.255 2>nul & goto:finmessage
if %multithreat% neq 0 for /f "usebackq tokens=1-5 delims=;" %%a in ("%logfile%") do if "%%c" neq "" (
    if /i "%%~xa" equ ".png" set /a "TotalSizePNG+=%%b" & set /a "ImageSizePNG+=%%c"
    if /i "%%~xa" equ ".jpg" set /a "TotalSizeJPG+=%%b" & set /a "ImageSizeJPG+=%%c"
    if /i "%%~xa" equ ".jpeg" set /a "TotalSizeJPG+=%%b" & set /a "ImageSizeJPG+=%%c"
    if /i "%%~xa" equ ".jpe" set /a "TotalSizeJPG+=%%b" & set /a "ImageSizeJPG+=%%c"
)
set /a "changePNG=%ImageSizePNG%-%TotalSizePNG%" 2>nul
set /a "percPNG=%ImageSizePNG%*100/%TotalSizePNG%" 2>nul
set /a "changeJPG=%ImageSizeJPG%-%TotalSizeJPG%" 2>nul
set /a "percJPG=%ImageSizeJPG%*100/%TotalSizeJPG%" 2>nul

1>nul 2>&1 del /f /q "%logfile%" "%countJPG%" "%countPNG%"

if "%jpeg%" equ "0" (
    echo  PNG: %changePNG% байт, %percPNG%%%
) else (
    if "%png%" equ "0" (
        echo  JPEG: %changeJPG% байт, %percJPG%%%
    ) else (
        echo  PNG:  %changePNG% байт, %percPNG%%%
        echo  JPEG: %changeJPG% байт, %percJPG%%%
    )
)

echo.
echo  Started  at - %stime%
echo  Finished at - %ftime%
echo.

:finmessage
echo  Оптимизация изображений завершена. Для выхода из приложения нажмите на Enter.
echo _______________________________________________________________________________

:waitupdate
if /i "%updatecheck%" neq "true" exit /b
if exist "%iculck%" (
    1>nul ping -n 1 -w 500 127.255.255.255 2>nul
    goto:waitupdate
)

if exist "%iculog%" (
    for /f "tokens=*" %%i in ('initool /f:"%iculog%" /s:"update" /k:"ver" ') do set "veru=%%~i"
    for /f "tokens=*" %%i in ('initool /f:"%iculog%" /s:"update" /k:"url" ') do set "urlu=%%~i"
    if "%version%" neq "!veru!" (
        title [Update] %name% %version%
        echo.
        echo  Доступна новая версия %name% !veru!
        echo  Вы можете загрузить её по адресу: !urlu!
        echo _______________________________________________________________________________
    )
    1>nul 2>&1 del /f /q "%iculog%"
)
if exist "%tmppath%" 1>nul 2>&1 rd /s /q "%tmppath%"
exit /b

:Non-interlaced-Xtreme
set "kp="
truepng -i0 -zc9 -zm3-9 -zs0-3 -fe -fs:7 %nc% %na% -force "%~f1"
for /f "tokens=2 delims=/f " %%j in ('pngout -l "%~f1"') do set "filter=%%j"
if "!filter!" neq "0" set "kp=-kp"
set "psize1=%~z1"
pngout -s3 -k1 "%~f1"
set "psize2=%~z1"
if !psize1! neq !psize2! (
    for /l %%j in (1,1,8) do pngout -s3 -k1 -n%%j "%~f1"
) else (
    pngout -s0 -f6 -k1 -ks !kp! "%~f1"
    advdef -z4 "%~f1"
)
exit /b

:Non-interlaced-Advanced
truepng -i0 -zc9 -zm8-9 -zs0-1 -f0,5 -fs:7 %nc% %na% -force "%~f1"
advdef -z4 "%~f1"
exit /b

:Interlaced-Xtreme
truepng -i1 -zc9 -zm8-9 -zs0-3 -fe -fs:7 %nc% %na% -force "%~f1"
advdef -z4 "%~f1"
exit /b

:Interlaced-Advanced
truepng -i1 -zc9 -zm8-9 -zs0-1 -f0,5 -fs:7 %nc% %na% -force "%~f1"
advdef -z4 "%~f1"
exit /b

2

Re: CMD/BAT: Image Catalyst

lorents пишет:

... на счет batch и хотел поговорить...

Покажите код скрипта здесь, используя соответствующие теги. Вряд ли народ захочет тянуть весь архив ради небольшого скрипта.

( 2 * b ) || ! ( 2 * b )

3

Re: CMD/BAT: Image Catalyst

Rumata вы правы, сделал

4 (изменено: Rumata, 2012-01-31 01:37:46)

Re: CMD/BAT: Image Catalyst

Скрипт большой. Разбираться в его логике - долго и вряд ли кто возьмется его вдумчиво исследовать. Я внимательно посмотрел несколько первых строк и вот что заметил.

Замечание 1.

if not exist "%apps%advdef.exe" set "nofile=%nofile%advdef.exe "
...
if not exist "%scripts%xmlhttprequest.js" set "nofile=%nofile%xmlhttprequest.js "
if defined nofile (

Что случится, если переменная nofile каким-либо образом уже существует до запуска этого скрипта? -- Скрипт сработает некорректно. Поэтому необходимо переменную инициализировать:

set nofile=

Следующий момент касается самого размера этой портянки. Нет смысла так расписывать ее. Лучше составьте список и пройдитесь по нему:

for %%n in ( advdef.exe ... xmlhttprequest.js ) do (
    if not exist "%apps%%%n" (
        rem сообщение об ошибке и выход из скрипта
    )
)

Замечание 2
Неоднородный выход из скрипта

if defined nofile (
...
    pause>nul &    goto:eof
)
if "%~1" neq "" (
    set "params=%*"
) else (
...
    pause>nul & exit
)

Мало того. exit, выполненный из скрипта, вызванного из командного процессора завершит и его.

Замечание 3
Аналогично первому.

for /f "tokens=1" %%i in ('initool /f:"%configpath%" /s:"jpeg" /k:"dc" ') do if /i "%%~i" equ "true" set "sec-jpeg=-dc"
for /f "tokens=1" %%i in ('initool /f:"%configpath%" /s:"jpeg" /k:"de" ') do if /i "%%~i" equ "true" set "sec-jpeg=%sec-jpeg% -de"
for /f "tokens=1" %%i in ('initool /f:"%configpath%" /s:"jpeg" /k:"di" ') do if /i "%%~i" equ "true" set "sec-jpeg=%sec-jpeg% -di"
for /f "tokens=1" %%i in ('initool /f:"%configpath%" /s:"jpeg" /k:"dx" ') do if /i "%%~i" equ "true" set "sec-jpeg=%sec-jpeg% -dx"
for /f "tokens=1" %%i in ('initool /f:"%configpath%" /s:"jpeg" /k:"du" ') do if /i "%%~i" equ "true" set "sec-jpeg=%sec-jpeg% -du"

Замечание 4
waithreat. Имеется в виду waitthreat?

Что значит threat (угроза) в метках XXXthreat и threatXXX? Может быть thread (поток, нить)?

( 2 * b ) || ! ( 2 * b )

5 (изменено: lorents, 2012-01-31 15:15:17)

Re: CMD/BAT: Image Catalyst

Благодарю за замечания! Будем исправлять
если есть еще замечания, то пишите.

6

Re: CMD/BAT: Image Catalyst

Да уж, простыня слишком объёмная.
Код вручную написан или с помощью чего-то?

Батник на 25 kb )))
EXE'шник короче будет.
Код можно оптимизировать и сократить как минимум вдвое-втрое.

Ни единого комментария. Анализировать невозможно.
Вы уж поправьте - озаглавьте блоки кода, коротенько изложите алгоритм скрипта.

Что касается явных ляпов.
Отладку проводили?
Запускаю и вижу крокозябры.

Начнём сразу с начала.

>nul chcp 866

Тогда уж продолжайте в оных рамках, чего уж мелочиться-то.

echo  ЏаЁ«®¦Ґ­ЁҐ ­Ґ ᬮЈ«® Ї®«гзЁвм ¤®бвгЇ Є б«Ґ¤гойЁ¬ д ©« ¬:

Правильно будет:

>nul chcp 1251

7 (изменено: lorents, 2012-01-31 23:45:40)

Re: CMD/BAT: Image Catalyst

Аскет
ни кто не жаловался на эти проблемы, надо будет разобраться
на счет комментариев, постараемся добавить

Аскет пишет:

Код вручную написан или с помощью чего-то?

под полностью написан вручную

8

Re: CMD/BAT: Image Catalyst

Кстати, может у кого есть идеи как можно сделать запуск диалоговых окон выбора папки и файла(ов) для batch, который будет работать на windows XP/Vista/7. Способ ищу универсальной, главное требование, что диалоговые окна были поверх batch.
Видел пример реализованный средствами mshta, но там нет блокировки окна batch. Может кто знает другие способы, можно средствами vbs или js, можно и средствами сторонней улиты (главное чтобы оно было бесплатное).

9

Re: CMD/BAT: Image Catalyst

lorents пишет:

…но там нет блокировки окна batch.

Что под сим понимается? Поясните.

lorents пишет:

…и средствами сторонней улиты (главное чтобы оно было бесплатное).

Попробуйте Winnity — диалог выбора папки или файла из командой строки.

10

Re: CMD/BAT: Image Catalyst

так не пойдет ?

echo off
set file=
for /f "delims=" %%x in ('mshta "javascript:window.onload=function(){self.resizeTo(0,0);self.moveTo(-100,-100);document.write('^<input type=file id=file /^>');document.all.file.click();(new ActiveXObject('Scripting.FileSystemObject')).GetStandardStream(1).WriteLine(document.all.file.value);window.close();}" ^| more') do set file=%%~x
echo %file%
Я конечно далек от мысли... (с)

11 (изменено: lorents, 2012-02-01 10:12:13)

Re: CMD/BAT: Image Catalyst

alexii
вроде как, то что мне надо. Спасибо! главное, если что можно и с автором поговорить

alexii пишет:

Что под сим понимается? Поясните.

что было как в других приложений, т.е. открывается диалоговое окно и окно приложение блокируется

smaharbA
мне не нравится через mshta по той причине, что запущенное окно отдельно от батника, я могу закрыть батник а окно останется. есть способ решить эту проблему?

сейчас заметил, у меня при запуске того или иного способа, в панели пуск отображается приложение,  можно ли его скрыть?

12

Re: CMD/BAT: Image Catalyst

Чтобы заблокировать окно, нужно знать id его "рукоятки" (handle).
Подставив значение окна консоли в browseforfolder, мы добъёмся желаемой блокировки.

13

Re: CMD/BAT: Image Catalyst

echo off
set "comm="javascript:^
self.resizeTo(0,0);^
window.onload=function()^
{^
    document.write('^<hta:application showintaskbar=no border=none /^>^<input type=file id=file /^>');^
    document.all.file.click();^
    new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(document.all.file.value);^
    window.close()^
}""
set file=
for /f "delims=" %%x in ('mshta %comm%') do set file=%%~x
echo %file%
Я конечно далек от мысли... (с)

14

Re: CMD/BAT: Image Catalyst

smaharbA благодарю за пример, у меня осталось несколько нерешенных вопросов:
1. можно ли добавить выбор нескольких файлов
2. как сделать выбор типов файлов
3. можно ли сделать, чтобы при закрытии батника, далоговое окно тоже закрывалось

15

Re: CMD/BAT: Image Catalyst

Вот тут еще поищите, неплохие утилитки.

Нас невозможно сбить с пути, нам пофигу куда идти.

16

Re: CMD/BAT: Image Catalyst

DnsIs
благодарю, нашел кое-что интересное и нужное

Чуть позже выставлю новый код проекта с изменениями и комментариями

17

Re: CMD/BAT: Image Catalyst

Добрый вечер!
Только что закончили работу над новой версии проекта, прошу посмотреть участников сообщества, может у кого будут идеи как улучшить проект.

ссылка на сам проект - http://rghost.ru/51057472

@echo off
>nul chcp 866

::Lorents & Res2001 2010-2013

setlocal enabledelayedexpansion
if "%~1" equ "thrt" call:threadwork "%~2" %3 %4 & exit /b
::if "%~1" equ "thrt" echo on & 1>>%4.log 2>&1 call:threadwork "%~2" %3 %4 & exit /b
if "%~1" equ "updateic" call:icupdate & exit /b
if "%~1" equ "" call:helpmsg

set "name=Image Catalyst"
set "version=2.2"
title [Loading] %name% %version%

set "fullname=%~0"
set "scrpath=%~dp0"
set "sconfig=%scrpath%tools\"
set "scripts=%scrpath%tools\scripts\"
set "tmppath=%TEMP%\%name%\"
set "errortimewait=30"
set "iclock=%TEMP%ic.lck"

:::::::::::BEGIN:Проверка, не запущен ли уже IC
set "runic="
::1.Ожидани завершение запущенного экземпляра IC. Все последующие IC, будут ждать, когда завершат работу предыдущие экземпляры.
::call:runningcheck "%~nx0"
::2.Все экземпляры IC работают одновременно. Второй и последующие экземпляры выводят информационное сообщение, что они не первые.
call:runic "%~nx0"
if defined runic (
    title [Waiting] %name% %version%
    1>&2 echo ???????????????????????????????????????????????????????????????????????????????
    1>&2 echo  Внимание: запущен %runic% экземпляр %name%.
    1>&2 echo ???????????????????????????????????????????????????????????????????????????????
    pause>nul
    cls
)
:::::::::::END:Проверка, не запущен ли уже IC
if not defined runic if exist "%tmppath%" 1>nul 2>&1 rd /s /q "%tmppath%"

set "apps=%~dp0Tools\apps\"
PATH %apps%;%PATH%
set "nofile="
if not exist "%scripts%filelist.txt" (
    title [Error] %name% %version%
    if exist "%tmppath%" 1>nul 2>&1 rd /s /q "%tmppath%"
    1>&2 echo ???????????????????????????????????????????????????????????????????????????????
    1>&2 echo  Приложение не смогло получить доступ к следующим файлам:
    1>&2 echo.
    1>&2 echo  - Tools\Scripts\filelist.txt
    1>&2 echo.
    1>&2 echo  Для выхода из приложения нажмите на Enter.
    1>&2 echo ???????????????????????????????????????????????????????????????????????????????
    pause>nul & exit
)
for /f "usebackq tokens=*" %%a in ("%scripts%filelist.txt") do if not exist "%scrpath%%%~a" set "nofile=!nofile!"%%~a" "
if defined nofile (
    title [Error] %name% %version%
    if exist "%tmppath%" 1>nul 2>&1 rd /s /q "%tmppath%"
    1>&2 echo ???????????????????????????????????????????????????????????????????????????????
    1>&2 echo  Приложение не смогло получить доступ к следующим файлам:
    1>&2 echo.
    for %%j in (%nofile%) do 1>&2 echo  - %%~j
    1>&2 echo.
    1>&2 echo  Для выхода из приложения нажмите на Enter.
    1>&2 echo ???????????????????????????????????????????????????????????????????????????????
    pause>nul & exit
)

:settemp
set "rnd=%random%"
if not exist "%tmppath%%rnd%\" (
    set "tmppath=%tmppath%%rnd%"
    1>nul 2>&1 md "%tmppath%%rnd%" || call:errormsg "Не возможно создать временный каталог:^|%tmppath%%rnd%!"
) else goto:settemp

set "ImageNumPNG=0"
set "ImageNumJPG=0"
set "TotalNumPNG=0"
set "TotalNumJPG=0"
set "TotalNumErrPNG=0"
set "TotalNumErrJPG=0"
set "TotalSizeJPG=0"
set "ImageSizeJPG=0"
set "TotalSizePNG=0"
set "ImageSizePNG=0"
set "changePNG=0"
set "changeJPG=0"
set "percPNG=0"
set "percJPG=0"
set "png="
set "jpeg="
set "stime="

set "updateurl=http://x128.ho.ua/update.ini"
set "configpath=%~dp0\Tools\config.ini"
set "logfile=%tmppath%\Images"
set "iculog=%tmppath%\icu.log"
set "iculck=%tmppath%\icu.lck"
set "countPNG=%tmppath%\countpng"
set "countJPG=%tmppath%\countjpg"
set "filelist=%tmppath%\filelist"
set "filelisterr=%tmppath%\filerr"
set "params="

::Чтение переменных из config.ini
set "fs=" & set "threadjpg=" & set "threadpng=" & set "updatecheck=" & set "outdir=" & set "outdir1=" & set "nooutfolder="
set "sec-jpeg=" & set "dt="
set "na=" & set "nc=" & set "chunks="
call:readini "%configpath%"
if /i "%fs%" equ "true" (set "fs=/s") else (set "fs=")
call:sethread %threadpng% & set "threadpng=!thread!" & set "thread="
call:sethread %threadjpg% & set "threadjpg=!thread!" & set "thread="
::if "%threadjpg%" equ "0" (set /a "threadjpg=2*%thread%") else set "threadjpg=!thread!"
::set "thread="
set "updatecheck=%update%" & set "update="
call set "outdir=%outdir%"
if /i "%outdir%" equ "true" (set "outdir=" & set "nooutfolder=yes") else if /i "%outdir%" equ "false" set "outdir="
if /i "%dt%" equ "true" (set "ft=-ft") else (set "ft=")
if /i "%dc%" equ "true" set "sec-jpeg=-dc" & set "dc="
if /i "%de%" equ "true" set "sec-jpeg=%sec-jpeg% -de" & set "de="
if /i "%di%" equ "true" set "sec-jpeg=%sec-jpeg% -di" & set "di="
if /i "%dx%" equ "true" set "sec-jpeg=%sec-jpeg% -dx" & set "dx="
if /i "%du%" equ "true" set "sec-jpeg=%sec-jpeg% -du" & set "du="
if /i "%nc%" equ "false" (set "nc=-nc") else (set "nc=")

set "multithread=0"
if %threadpng% gtr 1 set "multithread=1"
if %threadjpg% gtr 1 set "multithread=1"

if not defined nooutfolder if not defined outdir (
    for /f "tokens=* delims=" %%a in ('dlgmsgbox "Image Catalyst" "Folder3" " " "Выберите каталог назначения:" ') do set "outdir=%%~a"
)
if defined outdir (
    if "!outdir:~-1!" neq "\" set "outdir=!outdir!\"
    if not exist "!outdir!" (1>nul 2>&1 md "!outdir!" || call:errormsg "Не возможно создать каталог оптимизированных файлов:^|!outdir!^!")
    for /f "tokens=* delims=" %%a in ("!outdir!") do set outdirparam="/Outdir:%%~a"
) else set "outdirparam="

if "%~1" equ "" (
::    call:notparam
    goto:setcounters
)
cscript //nologo //E:JScript "%scripts%filter.js" %outdirparam% %* 1>"%filelist%" 2>"%filelisterr%"
:setcounters
::Подсчет общего количества обрабатываемых и пропускаемых файлов в разрезе png/jpg 
if exist "%filelist%" (
    for /f "tokens=3 delims=:" %%a in ('find /i /c ".png" "%filelist%" 2^>nul') do set /a "TotalNumPNG+=%%a"
    for /f "tokens=3 delims=:" %%a in ('find /i /c ".jpg" "%filelist%" 2^>nul') do set /a "TotalNumJPG+=%%a"
    for /f "tokens=3 delims=:" %%a in ('find /i /c ".jpe" "%filelist%" 2^>nul') do set /a "TotalNumJPG+=%%a"
)
if exist "%filelisterr%" (
    for /f "tokens=3 delims=:" %%a in ('find /i /c ".png" "%filelisterr%" 2^>nul') do set /a "TotalNumErrPNG+=%%a"
    for /f "tokens=3 delims=:" %%a in ('find /i /c ".jpg" "%filelisterr%" 2^>nul') do set /a "TotalNumErrJPG+=%%a"
    for /f "tokens=3 delims=:" %%a in ('find /i /c ".jpe" "%filelisterr%" 2^>nul') do set /a "TotalNumErrJPG+=%%a"
)

if %TotalNumPNG% equ 0 if %TotalNumJPG% equ 0 (
    1>&2 echo Файлов для оптимизации не найдено.
    call:helpmsg
)
::if "%TotalNumPNG%" equ "0" set "multithread=0"

::ввод параметров оптимизации
if %TotalNumPNG% gtr 0 if not defined png call:png
if %TotalNumJPG% gtr 0 if not defined jpeg call:jpeg

if %multithread% neq 0 (
    for /l %%a in (1,1,%threadpng%) do >"%logfile%png.%%a" echo.
    for /l %%a in (1,1,%threadjpg%) do >"%logfile%jpg.%%a" echo.
)
if not defined png set "png=0"
if not defined jpeg set "jpeg=0"

if /i "%na%" equ "false" (
    set "na=-na"
) else (
    if %png% equ 1 set "na=-a1"
    if %png% equ 2 set "na=-a0"
)
cls
echo _______________________________________________________________________________
echo.
if /i "%updatecheck%" equ "true" start "" /b cmd.exe /c ""%fullname%" updateic"
call:setitle
call:setvtime stime
set "outdirs="
for /f "usebackq tokens=1 delims=    " %%a in ("%filelist%") do (
    call:initsource "%%~a"
    if defined ispng if "%png%" neq "0" call:filework "%%~fa" png %threadpng% ImageNumPNG
    if defined isjpeg if "%jpeg%" neq "0" call:filework "%%~fa" jpg %threadjpg% ImageNumJPG
)

:waithread
call:waitflag "%tmppath%\thrt*.lck"
for /l %%z in (1,1,%threadpng%) do call:typelog png %%z
for /l %%z in (1,1,%threadjpg%) do call:typelog jpg %%z
call:setitle
::set "thrt="
::for /l %%z in (1,1,%threadpng%) do if exist "%tmppath%\thrtpng%%z.lck" (set "thrt=1") else (call:typelog & call:setitle)
::for /l %%z in (1,1,%threadjpg%) do if exist "%tmppath%\thrtjpg%%z.lck" (set "thrt=1") else (call:typelog & call:setitle)
::if defined thrt call:waitrandom 1000 & goto:waithread
cscript //nologo //E:JScript "%scripts%unfilter.js" <"%filelist%"
call:end
pause>nul & exit /b

::Проверка не запущен ли еще один экземпляр IC. Если запущен - ждем завершения.
::Второй запущенный процесс создает блокировочный файл %iclock% и ожидает завершения первого IC.
::Все остальные ожидают освобождения блокировочного файла.
::Когда первый IC заканчивает работу, второй выходит из ожидания и отпускает блокировочный файл.
::Первый из остальных IC, кто успел захватить файл, будет следующим в очереди на обработку.
::Параметры: %1    -    строка для поиска процесса
:runningcheck
call:runic "%~1"
set "lastrunic=%runic%"
if defined runic (
    title [Waiting] %name% %version%
    echo.Запущено больше одного процесса %name%. Ждем завершения.
    call:runningcheck2 "%~1"
)
exit /b

::Второй этап ожидания
:runningcheck2
2>nul (
    3>"%iclock%" 1>&3 call:runic2 "%~1" || (call:waitrandom 5000 & goto:runningcheck2)
)
exit /b

::Цикл ожидания для второго процесса IC
:runic2
call:waitrandom 5000
call:runic "%~1"
if defined runic (
    if %runic% lss %lastrunic% exit /b 0
    set "lastrunic=%runic%"
    goto:runic2
)    
exit /b 0

::Проверяем с помощью wmic запущено ли больше одного экземпляра IC. 
::Если да, то выставляем переменную runic в значение, равное количеству запущенных экземпляров IC.
::Параметры: %1    -    строка для поиска процесса
:runic
set "runic="
if exist "%systemroot%\system32\wbem\wmic.exe" (
    for /f "tokens=* delims=" %%a in ('wmic path win32_process where "CommandLine like '%%%~1%%'" get CommandLine /value ^| findstr /i /c:"%~1" ^| findstr /i /c:"cmd" ^| findstr /i /v "find findstr wmi thrt updateic" ^| find /i /c "%~1" ') do (
        if %%a gtr 1 set "runic=%%a"
))
exit /b

::Выводит диалоговое окно выбора файлов при отсутствии параметров.
:notparam
dlgmsgbox "Image Catalyst" "File1" " " "Все форматы ^(*.png;*.jpg;*.jpeg;*.jpe^)^|JPEG ^(*.jpg;*.jpeg;*.jpe^)^|PNG ^(*.png^)" |    cscript //nologo //E:JScript "%scripts%filter.js" %outdirparam% /IsStdIn:yes 1>"%filelist%" 2>"%filelisterr%"
exit /b

::Установка значения переменной, имя которой передано в %1, в текущую дату/время в формате для вывода итогов
::Параметры: нет
::Возвращаемые значения: Установленное значение переменной %1
:setvtime
set "%1=%date% %time:~0,2%:%time:~3,2%:%time:~6,2%"
exit /b

::Проверка доступности новой версии IC.
::Параметры: нет
::Возвращаемые значения: нет
:icupdate
if not exist "%scripts%xmlhttprequest.js" exit /b
>"%iculck%" echo.Update IC
cscript //nologo //E:JScript "%scripts%xmlhttprequest.js" %updateurl% 2>nul 1>"%iculog%" || 1>nul 2>&1 del /f /q "%iculog%"
1>nul 2>&1 del /f /q "%iculck%"
exit /b

::Запускает обработчик файла в однопоточном или многопоточном режиме.
::Параметры:
::    %1 - png | jpg
::    %2 - количество потоков данного вида
::    %3 - путь к обрабатываемому файлу
::Возвращаемые значения: нет
:createthread
if %2 equ 1 call:threadwork %3 %1 1 & call:typelog %1 1 & exit /b
for /l %%z in (1,1,%2) do (
    if not exist "%tmppath%\thrt%1%%z.lck" (
        call:typelog %1 %%z
        >"%tmppath%\thrt%1%%z.lck" echo Обработка файла: %3
        start /b cmd.exe /s /c ""%fullname%" thrt "%~3" %1 %%z"
        exit /b
    )
)
call:waitrandom 500
goto:createthread

::Перебор файлов для вывода статистики для многопоточного режима. Данные читаются из %logfile%*.
::Параметры: 
::    %1 - png | jpg
::    %2 - номер файла данного вида для вывода
::Возвращаемые значения: нет
:typelog
if %multithread% equ 0 exit /b
if not defined typenum%1%2 set "typenum%1%2=1"
call:typelogfile "%logfile%%1.%2" "typenum%1%2" %%typenum%1%2%% %1
exit /b

::Чтение файла и разбор строк для вывода статистики для многопоточного режима.
::Параметры:    %1 - файл в формате images.csv
::        %2 - имя переменной, в которой хранится количество обработанных строк в данном файле
::        %3 - количество обработанных строк в данном файле
::        %4 - JPG | PNG
::Возвращаемые значения: нет
:typelogfile
if not exist "%~1" exit /b
for /f "skip=%3 tokens=1-5 delims=;" %%b in ('type "%~1" ') do (
    if "%%d" equ "" (
        1>&2 echo  File  - "%%~b"
        1>&2 echo  Error - %%c
        1>&2 echo._______________________________________________________________________________
        1>&2 echo.
        set /a "TotalNumErr%4+=1"
        set /a "TotalNum%4-=1"
    ) else (
        call:printfileinfo "%%~b" %%c %%d %%e %%f
    )
    set /a "%~2+=1"
)
exit /b

::Вывод информации о файле с переводом в КБ.
::Параметры:
::    %1 - имя файла
::    %2 - размер входного файла в байтах
::    %3 - размер выходного файла в байтах
::    %4 - разница в байтах
::    %5 - разница в процентах
::Возвращаемые значения: нет
:printfileinfo
echo  File  - "%~f1"
set "float=%2"
call:division float 1024 100
echo  In    - %float% КБ
set "change=%4"
call:division change 1024 100
set "float=%3"
call:division float 1024 100
echo  Out   - %float% КБ ^(%change% КБ, %5%%^)
echo _______________________________________________________________________________
echo.
exit /b

::Запуск обработчиков файлов для многопоточной обработки.
::Параметры:
::    %1 - путь к обрабатываемому файлу
::    %2 - png | jpg
::    %3 - номер потока данного вида
::Возвращаемые значения: нет
:threadwork
if /i "%2" equ "png" call:pngfilework %1 %3 & if %multithread% neq 0 >>"%countPNG%.%3" echo.1
if /i "%2" equ "jpg" call:jpegfilework %1 %3 & if %multithread% neq 0 >>"%countJPG%.%3" echo.1
if exist "%tmppath%\thrt%2%3.lck" >nul 2>&1 del /f /q "%tmppath%\thrt%2%3.lck"
exit /b

::Ожидает отсутствие заданного в %1 файла. Служит для ожидания снятия блокировки при многопоточной обработки.
::Параметры: %1 - путь к файлу флагу.
::Возвращаемые значения: нет
:waitflag
if not exist "%~1" exit /b
call:waitrandom 2000
goto:waitflag

::Ожидает случайное количество миллисекунд, ограниченное заданным параметром.
::Параметры: %1 - ограничение случайного значения количества млсек.
::Возвращаемые значения: нет
:waitrandom
set /a "ww=%random%%%%1"
1>nul 2>&1 ping -n 1 -w %ww% 127.255.255.255
exit /b

::Процедура инициализации переменных для очередного источника обработки.
::Параметры: %1 - путь к файлу.
::Возвращаемые значения: проинициализированные переменные isjpeg, ispng, isfolder.
:initsource
set "isjpeg="
set "ispng="
set "isfolder="
if /i "%~x1" equ ".png" set "ispng=1"
if /i "%~x1" equ ".jpg" set "isjpeg=1"
if /i "%~x1" equ ".jpeg" set "isjpeg=1"
if /i "%~x1" equ ".jpe" set "isjpeg=1"
exit /b

::Установка количества потоков для многопоточной обработки. 
::Параметры: %1 - предлагаемое количество потоков (может отсутствовать).
::Возвращаемые значения: проинициализированная переменная thread.
:sethread
if "%~1" neq "" if "%~1" neq "0" set "thread=%~1" & exit /b
set /a "thread=%~1+1-1"
if "!thread!" equ "0" set "thread=%NUMBER_OF_PROCESSORS%"
::if %thread% gtr 2 set /a "thread-=1"
exit /b

::Ввод параметров оптимизации png файлов. 
::Параметры: нет
::Возвращаемые значения: проинициализированная переменная png.
:png
cls
title [PNG: %TotalNumPNG%] %name% %version%
echo  ?????????????????????????
echo  Параметр оптимизации PNG:
echo  ?????????????????????????
echo.
echo  [1] Xtreme    [2] Advanced
echo.
echo  [0] Пропустить оптимизацию изображений формата PNG
echo.
set png=
echo  ?????????????????????????????????????????????????????????????
set /p png="#Укажите параметр оптимизации PNG и нажмите на Enter [0-2]: "
echo  ?????????????????????????????????????????????????????????????
echo.
if "%png%" equ "" goto:png
if "%png%" equ "0" exit /b
if "%png%" neq "1" if "%png%" neq "2" goto:png
exit /b

::Ввод параметров оптимизации jpg файлов. 
::Параметры: нет
::Возвращаемые значения: проинициализированная переменная jpeg.
:jpeg
cls
title [JPEG: %TotalNumJPG%] %name% %version%
echo  ??????????????????????????
echo  Параметр оптимизации JPEG:
echo  ??????????????????????????
echo.
echo  [1] Optimize    [2] Progressive
echo.
echo  [3] Maximum    [4] Default
echo.
echo  [0] Пропустить оптимизацию изображений формата JPEG
echo.
set jpeg=
echo  ??????????????????????????????????????????????????????????????
set /p jpeg="#Укажите параметр оптимизации JPEG и нажмите на Enter [0-4]: "
echo  ??????????????????????????????????????????????????????????????
echo.
if "%jpeg%" equ "" goto:jpeg
if "%jpeg%" equ "0" exit /b
if "%jpeg%" neq "1" if "%jpeg%" neq "2" if "%jpeg%" neq "3" if "%jpeg%" neq "4" goto:jpeg
exit /b

::Установка заголовка окна во время оптимизации.
::Параметры: нет
::Возвращаемые значения: нет
:setitle
if "%jpeg%" equ "0" if "%png%" equ "0" (title %~1%name% %version% & exit /b)
if %multithread% neq 0 (
    set "ImageNumPNG=0" & set "ImageNumJPG=0"
    for /l %%c in (1,1,%threadpng%) do for %%b in ("%countPNG%.%%c") do set /a "ImageNumPNG+=%%~zb/3" 2>nul
    for /l %%c in (1,1,%threadjpg%) do for %%b in ("%countJPG%.%%c") do set /a "ImageNumJPG+=%%~zb/3" 2>nul
)
if "%jpeg%" equ "0" (
    title %~1[PNG - %png%: %ImageNumPNG%/%TotalNumPNG%] %name% %version%
) else (
    if "%png%" equ "0" (
        title %~1[JPEG - %jpeg%: %ImageNumJPG%/%TotalNumJPG%] %name% %version%
    ) else (
        title %~1[PNG - %png%: %ImageNumPNG%/%TotalNumPNG%] [JPEG - %jpeg%: %ImageNumJPG%/%TotalNumJPG%] %name% %version%
    )
)
exit /b

::Запуск обработчика файлов.
::Параметры:
::    %1 - обрабатываемый файл
::    %2 - png | jpg
::    %3 - %threadpng% | %threadjpg%
::    %4 - ImageNumPNG | ImageNumJPG
::Возвращаемые значения: нет
:filework
call:createthread %2 %3 "%~f1"
set /a "%4+=1"
call:setitle
exit /b

::Обработчик png файлов.
::Параметры:
::    %1 - путь к обрабатываемому файлу
::    %2 - номер потока обработки
::Возвращаемые значения: нет
:pngfilework
set "zc="
set "zm="
set "zs="
set "errbackup=0"
set "isinterlaced%2="
set "logfile2=%logfile%png.%2"
set pnglog="%tmppath%\png%2.log"
set "filework=%tmppath%\%~n1-ic%2%~x1"
1>nul 2>&1 copy /b /y "%~f1" "%filework%" || (call:saverrorlog "%~f1" "Файл не найден" & exit /b)
truepng -info "%filework%" >nul
if errorlevel 1 (
    call:saverrorlog "%~f1" "Файл не поддерживается"
    1>nul 2>&1 del /f /q %filework%
    exit /b
)
set "psize=%~z1"
if %png% equ 1 (
    >%pnglog% 2>nul truepng -i0 -zc9 -zm4-9 -zs0-3 -f0,5 -fs:2 %nc% %na% -force "%filework%"
    for /f "tokens=2,4,6,8,10 delims=:    " %%a in ('findstr /r /i /b /c:"zc:..zm:..zs:" %pnglog%') do (
        set "zc=%%a"
        set "zm=%%b"
        set "zs=%%c"
    )
    pngwolf --zlib-level=!zc! --zlib-memlevel=!zm! --zlib-strategy=!zs! --max-time=1 --even-if-bigger --in="%filework%" --out="%filework%" 1>nul 2>&1
    advdef -z4 -i15 "%filework%" 1>nul 2>&1
    1>nul 2>&1 del /f /q %pnglog%
)
if %png% equ 2 (
    truepng -i0 -zc9 -zm8-9 -zs0-1 -f0,5 -fs:7 %nc% %na% -force "%filework%" 1>nul 2>&1
    advdef -z3 "%filework%" 1>nul 2>&1
)
deflopt -k "%filework%" >nul
defluff < "%filework%" > "%filework%-defluff.png" 2>nul
1>nul 2>&1 move /y "%filework%-defluff.png" "%filework%"
deflopt -k "%filework%" >nul
call:backup "%~f1" "%filework%" >nul || set "errbackup=1"
if %errbackup% neq 0 (call:saverrorlog "%~f1" "Отказано в доступе или файл не существует." & 1>nul 2>&1 del /f /q %filework% & exit /b)
truepng -nz -md %chunks% "%~f1" >nul
call:savelog "%~f1" !psize!
if %multithread% equ 0 for %%a in ("%~f1") do (set /a "ImageSizePNG+=%%~za" & set /a "TotalSizePNG+=%psize%")
exit /b

::Обработчик jpg файлов.
::Параметры:
::    %1 - путь к обрабатываемому файлу
::    %2 - номер потока обработки
::Возвращаемые значения: нет
:jpegfilework
set "ep="
set "cm="
set "errbackup=0"
set "logfile2=%logfile%jpg.%2"
set "filework=%tmppath%\%~n1%2%~x1"
set jpglog="%tmppath%\jpg%2.log"
1>nul 2>&1 copy /b /y "%~f1" "%filework%" || (call:saverrorlog "%~f1" "Файл не найден" & exit /b)
jhead -v "%filework%">>%jpglog%
if errorlevel 1 (call:saverrorlog "%~f1" "Файл не поддерживается" & 1>nul 2>&1 del /f /q "%filework%" & exit /b)
for /f "tokens=2 delims=," %%a in ('findstr /r /c:"JPEG image is .*w \* .*h, .* color components, .* bits per sample" %jpglog%') do (
    for /f "tokens=1" %%b in ("%%a") do set "cm=%%b"
)
1>nul 2>&1 findstr /c:"Jpeg process : Progressive" %jpglog%
if %errorlevel% equ 0 (set "ep=Progressive")
if %errorlevel% equ 1 (set "ep=Baseline")
del /f /q %jpglog%
set "jsize=%~z1"
if %jpeg% equ 1 (
    jpegtran -copy all -optimize "%filework%" "%filework%" >nul
    if /i "!ep!" equ "Baseline" call:backup "%~f1" "%filework%" >nul || set "errbackup=1"
    if /i "!ep!" equ "Progressive" 1>nul 2>&1 move /y "%filework%" "%~f1" || set "errbackup=1"
)
if %jpeg% equ 2 (
    if /i "!cm!" equ "4" jpegtran -copy all -progressive "%filework%" "%filework%" >nul
    if /i "!cm!" equ "3" perl "%scripts%jpegrescan.pl" jpegtran "%filework%" "%filework%" >nul
    if /i "!cm!" equ "1" perl "%scripts%jpegrescan.pl" jpegtran "%filework%" "%filework%" >nul
    if /i "!ep!" equ "Baseline" 1>nul 2>&1 move /y "%filework%" "%~f1" || set "errbackup=1"
    if /i "!ep!" equ "Progressive" call:backup "%~f1" "%filework%" >nul || set "errbackup=1"
)
if %jpeg% equ 3 (
    jpegtran -copy all -optimize "%filework%" "%filework%.opt" >nul
    if /i "!cm!" equ "4" jpegtran -copy all -progressive "%filework%" "%filework%.pro" >nul
    if /i "!cm!" equ "3" perl "%scripts%jpegrescan.pl" jpegtran "%filework%" "%filework%.pro" >nul
    if /i "!cm!" equ "1" perl "%scripts%jpegrescan.pl" jpegtran "%filework%" "%filework%.pro" >nul
    call:backup "%~f1" "%filework%.opt" >nul || set "errbackup=1"
    call:backup "%~f1" "%filework%.pro" >nul || set "errbackup=1"
)
if %jpeg% equ 4 (
    if /i "!ep!" equ "Baseline" jpegtran -copy all -optimize "%filework%" "%filework%" >nul
    if /i "!ep!" equ "Progressive" (
        if /i "!cm!" equ "4" jpegtran -copy all -progressive "%filework%" "%filework%" >nul
        if /i "!cm!" equ "3" perl "%scripts%jpegrescan.pl" jpegtran "%filework%" "%filework%" >nul
        if /i "!cm!" equ "1" perl "%scripts%jpegrescan.pl" jpegtran "%filework%" "%filework%" >nul
    )
    call:backup "%~f1" "%filework%" >nul || set "errbackup=1"
)
if %errbackup% neq 0 (call:saverrorlog "%~f1" "Отказано в доступе или файл не существует." & 1>nul 2>&1 del /f /q %filework% & exit /b)
jhead %sec-jpeg% %ft% "%~f1" 1>nul 2>nul
call:savelog "%~f1" !jsize!
if %multithread% equ 0 for %%a in ("%~f1") do (set /a "ImageSizeJPG+=%%~za" & set /a "TotalSizeJPG+=%jsize%")
exit /b

::Если размер файла %2 больше, чем размер %1, то %2 переносится на место %1, иначе %2 удаляется.
::Параметры:
::    %1 - путь к первому файл
::    %2 - путь ко второму файлу
::Возвращаемые значения: нет
:backup
if not exist "%~1" exit /b 2
if not exist "%~2" exit /b 3
if %~z1 leq %~z2 (1>nul 2>&1 del /f /q %2) else (1>nul 2>&1 move /y %2 %1 || exit /b 1)
exit /b

::Вычисление разницы размера исходного и оптимизированного файла (chaneg и perc).
::Для многопоточной обработки запись в %logfile% информации об обработанном файле.
::Для однопоточной обработки вывод статистики на экран.
::Параметры:
::    %1 - путь к оптимизированному файлу
::    %2 - размер исходного файла
::Возвращаемые значения: нет
:savelog
set /a "change=%~z1-%2"
set /a "perc=%change%*100/%2" 2>nul
set /a "fract=%change%*100%%%2*100/%2" 2>nul
set /a "perc=%perc%*100+%fract%"
call:division perc 100 100
if %multithread% neq 0 (
    >>"%logfile2%" echo.%~1;%2;%~z1;%change%;%perc%
) else (
    call:printfileinfo "%~1" %2 %~z1 %change% %perc%
)
exit /b

::Операция деления двух целых чисел, результат - дробное число.
::Параметры:
::    %1 - имя переменной, содержащей целое число делимое
::    %2 - делитель
::    %3 - 10/100/1000... - округление дробной части (до десятых, до сотых, до тысячных, ...)
::Возвращаемые значения: set %1=вычисленное дробное частное
:division
set "sign="
1>nul 2>&1 set /a "int=!%1!/%2"
1>nul 2>&1 set /a "fractd=!%1!*%3/%2%%%3"
if "%fractd:~,1%" equ "-" (set "sign=-" & set "fractd=%fractd:~1%")
1>nul 2>&1 set /a "fractd=%3+%fractd%"
if "%int:~,1%" equ "-" set "sign="
set "%1=%sign%%int%.%fractd:~1%
exit /b

::Для многопоточной обработки запись сообщения об ошибке обработки в %logfile%.
::Для однопоточной обработки вывод сообщения об ошибке на экран.
::Параметры:
::    %1 - путь к оптимизированному файлу
::    %2 - сообщение об ошибке
::Возвращаемые значения: нет
:saverrorlog
1>nul 2>&1 del /f /q "%filework%"
if %multithread% neq 0 (
    >>"%logfile2%" echo.%~1;%~2
) else (
    1>&2 echo  File  - "%~f1"
    1>&2 echo  Error - %~2
    1>&2 echo _______________________________________________________________________________
    1>&2 echo.
)
exit /b

::Вывод итогового сообщения о статистике обработки и наличии обновлений.
::Параметры: нет
::Возвращаемые значения: нет
:end
if not defined stime call:setvtime stime
call:setvtime ftime
set "changePNG=0" & set "percPNG=0" & set "fract=0"
set "changeJPG=0" & set "percJPG=0" & set "fract=0"
if "%jpeg%" equ "0" if "%png%" equ "0" 1>nul 2>&1 ping -n 1 -w 500 127.255.255.255 & goto:finmessage
if %multithread% neq 0 (
    for /l %%i in (1,1,%threadpng%) do if exist "%logfile%png.%%i" (
        for /f "usebackq tokens=1-5 delims=;" %%a in ("%logfile%png.%%i") do if "%%c" neq "" (
            set /a "TotalSizePNG+=%%b" & set /a "ImageSizePNG+=%%c"
        )
    )
    for /l %%i in (1,1,%threadjpg%) do if exist "%logfile%jpg.%%i" (
        for /f "usebackq tokens=1-5 delims=;" %%a in ("%logfile%jpg.%%i") do if "%%c" neq "" (
            set /a "TotalSizeJPG+=%%b" & set /a "ImageSizeJPG+=%%c"
        )
    )
)
set /a "changePNG=(%ImageSizePNG%-%TotalSizePNG%)" 2>nul
set /a "percPNG=%changePNG%*100/%TotalSizePNG%" 2>nul
set /a "fract=%changePNG%*100%%%TotalSizePNG%*100/%TotalSizePNG%" 2>nul
set /a "percPNG=%percPNG%*100+%fract%" 2>nul
call:division changePNG 1024 100
call:division percPNG 100 100

set /a "changeJPG=(%ImageSizeJPG%-%TotalSizeJPG%)" 2>nul
set /a "percJPG=%changeJPG%*100/%TotalSizeJPG%" 2>nul
set /a "fract=%changeJPG%*100%%%TotalSizeJPG%*100/%TotalSizeJPG%" 2>nul
set /a "percJPG=%percJPG%*100+%fract%" 2>nul
call:division changeJPG 1024 100
call:division percJPG 100 100

:finmessage
call:totalmsg PNG %png%
call:totalmsg JPG %jpeg%
echo  Started  at - %stime%
echo  Finished at - %ftime%
echo.
echo  Оптимизация изображений завершена. Для выхода из приложения нажмите на Enter.
echo _______________________________________________________________________________
if /i "%updatecheck%" equ "true" (
    call:waitflag "%iculck%"
    1>nul 2>&1 del /f /q "%iculck%"
    if exist "%iculog%" (
        call:readini "%iculog%"
        if "%version%" neq "!ver!" (
            set "isupdate="
            for /f "tokens=* delims=" %%a in ('dlgmsgbox "Image Catalyst" "Msg1" " " "Доступна новая версия %name% !ver!^|Хотите обновить?" "Q4" "%errortimewait%" 2^>nul') do set "isupdate=%%~a"
            if "!isupdate!" equ "6" start "" !url!
        )
        1>nul 2>&1 del /f /q "%iculog%"
    )
)
1>nul 2>&1 del /f /q "%logfile%*" "%countJPG%" "%countPNG%*" "%filelist%*" "%filelisterr%*" "%iclock%"
if exist "%tmppath%" 1>nul 2>&1 rd /s /q "%tmppath%"
exit /b

:totalmsg
call set /a "tt=%%TotalNum%1%%+%%TotalNumErr%1%%"
if "%2" equ "0" (
    set "opt=0"
    set "tterr=%tt%"
) else (
    call set opt=%%TotalNum%1%%
    call set "tterr=%%TotalNumErr%1%%"
)
if "%tt%" neq "0" (
    echo  Total Number of %1:    %tt%
    echo  Optimized %1:        %opt%
    if "%tterr%" neq "0" echo  Skipped %1:        %tterr%
    call echo  Total %1:          %%change%1%% КБ, %%perc%1%%%%%%
    echo.
)
exit /b

::Читает-ini файл. Каждый параметр ini-файла преобразовывается в одноименную переменную с 
::соответствющим содержимым. Коментарии в ini - символ ";" в начале строки, имена секций - игнорируются.
::Параметры: %1 - ini-файл
::Возвращаемые значения: набор переменных сгенерированных на основании ini-файла.
:readini
for /f "usebackq tokens=1,* delims== " %%a in ("%~1") do (
    set param=%%a
    if "!param:~,1!" neq ";" if "!param:~,1!" neq "[" set "%%~a=%%~b"
)
exit /b

:helpmsg
title [Manual] %name% %version%
1>&2 echo ???????????????????????????????????????????????????????????????????????????????
1>&2 echo  Оптимизировать изображения формата PNG и JPEG можно следующими способами:
1>&2 echo  1. перенесите файлы и/или папки с файлами на иконку "Image Catalyst.bat";
1>&2 echo  2. запустите "Image Catalyst.bat" с параметрами "файл/папка с файлами".
1>&2 echo.
1>&2 echo  Настоятельно рекомендуется перед оптимизацией изучить справку ^(ReadMe.txt^)
1>&2 echo  Для выхода из приложения нажмите на Enter.
1>&2 echo ???????????????????????????????????????????????????????????????????????????????
if exist "%tmppath%" 1>nul 2>&1 rd /s /q "%tmppath%"
pause>nul & exit

:errormsg
title [Error] %name% %version%
if exist "%tmppath%" 1>nul 2>&1 rd /s /q "%tmppath%"
if "%~1" neq "" 1>nul 2>&1 dlgmsgbox "Image Catalyst" "Msg1" " " "%~1" "E0" "%errortimewait%"
exit

:PNG-Xtreme
set "kp="
truepng -i0 -zc9 -zm5-9 -zs0-3 -fe -fs:7 %nc% %na% -force "%~f1"
for /f "tokens=2 delims=/f " %%j in ('pngout -l "%~f1"') do set "filter=%%j"
if "!filter!" neq "0" set "kp=-kp"
set "psize1=%~z1"
pngout -s3 -k1 "%~f1"
set "psize2=%~z1"
if !psize1! neq !psize2! (for /l %%j in (1,1,8) do pngout -s3 -k1 -n%%j "%~f1") else (pngout -s0 -f6 -k1 -ks !kp! "%~f1")
advdef -z3 "%~f1"
exit /b

18 (изменено: lorents, 2015-08-22 12:55:28)

Re: CMD/BAT: Image Catalyst

Image Catalyst 2.5 - https://github.com/lorents17/iCatalyst