<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; CMD/BAT: Image Catalyst]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6748&amp;type=atom" />
	<updated>2015-08-22T08:55:17Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=6748</id>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Image Catalyst]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=96729#p96729" />
			<content type="html"><![CDATA[<p>Image Catalyst 2.5 - <a href="https://github.com/lorents17/iCatalyst">https://github.com/lorents17/iCatalyst</a></p>]]></content>
			<author>
				<name><![CDATA[lorents]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27502</uri>
			</author>
			<updated>2015-08-22T08:55:17Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=96729#p96729</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Image Catalyst]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=78233#p78233" />
			<content type="html"><![CDATA[<p>Добрый вечер!<br />Только что закончили работу над новой версии проекта, прошу посмотреть участников сообщества, может у кого будут идеи как улучшить проект.</p><p>ссылка на сам проект - http://rghost.ru/51057472</p><div class="codebox"><pre><code>@echo off
&gt;nul chcp 866

::Lorents &amp; Res2001 2010-2013

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

set &quot;name=Image Catalyst&quot;
set &quot;version=2.2&quot;
title [Loading] %name% %version%

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

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

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

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

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

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

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

set &quot;multithread=0&quot;
if %threadpng% gtr 1 set &quot;multithread=1&quot;
if %threadjpg% gtr 1 set &quot;multithread=1&quot;

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

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

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

::ввод параметров оптимизации
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 &gt;&quot;%logfile%png.%%a&quot; echo.
    for /l %%a in (1,1,%threadjpg%) do &gt;&quot;%logfile%jpg.%%a&quot; echo.
)
if not defined png set &quot;png=0&quot;
if not defined jpeg set &quot;jpeg=0&quot;

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

:waithread
call:waitflag &quot;%tmppath%\thrt*.lck&quot;
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 &quot;thrt=&quot;
::for /l %%z in (1,1,%threadpng%) do if exist &quot;%tmppath%\thrtpng%%z.lck&quot; (set &quot;thrt=1&quot;) else (call:typelog &amp; call:setitle)
::for /l %%z in (1,1,%threadjpg%) do if exist &quot;%tmppath%\thrtjpg%%z.lck&quot; (set &quot;thrt=1&quot;) else (call:typelog &amp; call:setitle)
::if defined thrt call:waitrandom 1000 &amp; goto:waithread
cscript //nologo //E:JScript &quot;%scripts%unfilter.js&quot; &lt;&quot;%filelist%&quot;
call:end
pause&gt;nul &amp; exit /b

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

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

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

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

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

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

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

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

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

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

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

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

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

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

::Установка количества потоков для многопоточной обработки. 
::Параметры: %1 - предлагаемое количество потоков (может отсутствовать).
::Возвращаемые значения: проинициализированная переменная thread.
:sethread
if &quot;%~1&quot; neq &quot;&quot; if &quot;%~1&quot; neq &quot;0&quot; set &quot;thread=%~1&quot; &amp; exit /b
set /a &quot;thread=%~1+1-1&quot;
if &quot;!thread!&quot; equ &quot;0&quot; set &quot;thread=%NUMBER_OF_PROCESSORS%&quot;
::if %thread% gtr 2 set /a &quot;thread-=1&quot;
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=&quot;#Укажите параметр оптимизации PNG и нажмите на Enter [0-2]: &quot;
echo  ?????????????????????????????????????????????????????????????
echo.
if &quot;%png%&quot; equ &quot;&quot; goto:png
if &quot;%png%&quot; equ &quot;0&quot; exit /b
if &quot;%png%&quot; neq &quot;1&quot; if &quot;%png%&quot; neq &quot;2&quot; 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=&quot;#Укажите параметр оптимизации JPEG и нажмите на Enter [0-4]: &quot;
echo  ??????????????????????????????????????????????????????????????
echo.
if &quot;%jpeg%&quot; equ &quot;&quot; goto:jpeg
if &quot;%jpeg%&quot; equ &quot;0&quot; exit /b
if &quot;%jpeg%&quot; neq &quot;1&quot; if &quot;%jpeg%&quot; neq &quot;2&quot; if &quot;%jpeg%&quot; neq &quot;3&quot; if &quot;%jpeg%&quot; neq &quot;4&quot; goto:jpeg
exit /b

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

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

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

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

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

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

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

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

set /a &quot;changeJPG=(%ImageSizeJPG%-%TotalSizeJPG%)&quot; 2&gt;nul
set /a &quot;percJPG=%changeJPG%*100/%TotalSizeJPG%&quot; 2&gt;nul
set /a &quot;fract=%changeJPG%*100%%%TotalSizeJPG%*100/%TotalSizeJPG%&quot; 2&gt;nul
set /a &quot;percJPG=%percJPG%*100+%fract%&quot; 2&gt;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 &quot;%updatecheck%&quot; equ &quot;true&quot; (
    call:waitflag &quot;%iculck%&quot;
    1&gt;nul 2&gt;&amp;1 del /f /q &quot;%iculck%&quot;
    if exist &quot;%iculog%&quot; (
        call:readini &quot;%iculog%&quot;
        if &quot;%version%&quot; neq &quot;!ver!&quot; (
            set &quot;isupdate=&quot;
            for /f &quot;tokens=* delims=&quot; %%a in (&#039;dlgmsgbox &quot;Image Catalyst&quot; &quot;Msg1&quot; &quot; &quot; &quot;Доступна новая версия %name% !ver!^|Хотите обновить?&quot; &quot;Q4&quot; &quot;%errortimewait%&quot; 2^&gt;nul&#039;) do set &quot;isupdate=%%~a&quot;
            if &quot;!isupdate!&quot; equ &quot;6&quot; start &quot;&quot; !url!
        )
        1&gt;nul 2&gt;&amp;1 del /f /q &quot;%iculog%&quot;
    )
)
1&gt;nul 2&gt;&amp;1 del /f /q &quot;%logfile%*&quot; &quot;%countJPG%&quot; &quot;%countPNG%*&quot; &quot;%filelist%*&quot; &quot;%filelisterr%*&quot; &quot;%iclock%&quot;
if exist &quot;%tmppath%&quot; 1&gt;nul 2&gt;&amp;1 rd /s /q &quot;%tmppath%&quot;
exit /b

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

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

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

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

:PNG-Xtreme
set &quot;kp=&quot;
truepng -i0 -zc9 -zm5-9 -zs0-3 -fe -fs:7 %nc% %na% -force &quot;%~f1&quot;
for /f &quot;tokens=2 delims=/f &quot; %%j in (&#039;pngout -l &quot;%~f1&quot;&#039;) do set &quot;filter=%%j&quot;
if &quot;!filter!&quot; neq &quot;0&quot; set &quot;kp=-kp&quot;
set &quot;psize1=%~z1&quot;
pngout -s3 -k1 &quot;%~f1&quot;
set &quot;psize2=%~z1&quot;
if !psize1! neq !psize2! (for /l %%j in (1,1,8) do pngout -s3 -k1 -n%%j &quot;%~f1&quot;) else (pngout -s0 -f6 -k1 -ks !kp! &quot;%~f1&quot;)
advdef -z3 &quot;%~f1&quot;
exit /b</code></pre></div>]]></content>
			<author>
				<name><![CDATA[lorents]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27502</uri>
			</author>
			<updated>2013-12-18T19:33:06Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=78233#p78233</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Image Catalyst]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=56487#p56487" />
			<content type="html"><![CDATA[<p><strong>DnsIs</strong><br />благодарю, нашел кое-что интересное и нужное</p><p>Чуть позже выставлю новый код проекта с изменениями и комментариями</p>]]></content>
			<author>
				<name><![CDATA[lorents]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27502</uri>
			</author>
			<updated>2012-02-06T06:55:02Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=56487#p56487</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Image Catalyst]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=56484#p56484" />
			<content type="html"><![CDATA[<p><a href="http://www.horstmuc.de">Вот тут</a> еще поищите, неплохие утилитки.</p>]]></content>
			<author>
				<name><![CDATA[DnsIs]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26282</uri>
			</author>
			<updated>2012-02-06T05:49:50Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=56484#p56484</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Image Catalyst]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=56297#p56297" />
			<content type="html"><![CDATA[<p><strong>smaharbA</strong> благодарю за пример, у меня осталось несколько нерешенных вопросов:<br />1. можно ли добавить выбор нескольких файлов<br />2. как сделать выбор типов файлов<br />3. можно ли сделать, чтобы при закрытии батника, далоговое окно тоже закрывалось</p>]]></content>
			<author>
				<name><![CDATA[lorents]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27502</uri>
			</author>
			<updated>2012-02-01T14:31:12Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=56297#p56297</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Image Catalyst]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=56285#p56285" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>echo off
set &quot;comm=&quot;javascript:^
self.resizeTo(0,0);^
window.onload=function()^
{^
    document.write(&#039;^&lt;hta:application showintaskbar=no border=none /^&gt;^&lt;input type=file id=file /^&gt;&#039;);^
    document.all.file.click();^
    new ActiveXObject(&#039;Scripting.FileSystemObject&#039;).GetStandardStream(1).WriteLine(document.all.file.value);^
    window.close()^
}&quot;&quot;
set file=
for /f &quot;delims=&quot; %%x in (&#039;mshta %comm%&#039;) do set file=%%~x
echo %file%</code></pre></div>]]></content>
			<author>
				<name><![CDATA[smaharbA]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2911</uri>
			</author>
			<updated>2012-02-01T12:09:22Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=56285#p56285</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Image Catalyst]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=56269#p56269" />
			<content type="html"><![CDATA[<p>Чтобы заблокировать окно, нужно знать id его &quot;рукоятки&quot; (handle).<br />Подставив значение окна консоли в browseforfolder, мы добъёмся желаемой блокировки.</p>]]></content>
			<author>
				<name><![CDATA[Аскет]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=25748</uri>
			</author>
			<updated>2012-02-01T09:51:55Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=56269#p56269</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Image Catalyst]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=56242#p56242" />
			<content type="html"><![CDATA[<p><strong>alexii</strong><br />вроде как, то что мне надо. Спасибо! главное, если что можно и с автором поговорить</p><div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>Что под сим понимается? Поясните.</p></blockquote></div><p>что было как в других приложений, т.е. открывается диалоговое окно и окно приложение блокируется</p><p><strong>smaharbA</strong><br />мне не нравится через mshta по той причине, что запущенное окно отдельно от батника, я могу закрыть батник а окно останется. есть способ решить эту проблему?</p><p>сейчас заметил, у меня при запуске того или иного способа, в панели пуск отображается приложение,&nbsp; можно ли его скрыть?</p>]]></content>
			<author>
				<name><![CDATA[lorents]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27502</uri>
			</author>
			<updated>2012-02-01T05:17:54Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=56242#p56242</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Image Catalyst]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=56241#p56241" />
			<content type="html"><![CDATA[<p>так не пойдет ?<br /></p><div class="codebox"><pre><code>echo off
set file=
for /f &quot;delims=&quot; %%x in (&#039;mshta &quot;javascript:window.onload=function(){self.resizeTo(0,0);self.moveTo(-100,-100);document.write(&#039;^&lt;input type=file id=file /^&gt;&#039;);document.all.file.click();(new ActiveXObject(&#039;Scripting.FileSystemObject&#039;)).GetStandardStream(1).WriteLine(document.all.file.value);window.close();}&quot; ^| more&#039;) do set file=%%~x
echo %file%</code></pre></div>]]></content>
			<author>
				<name><![CDATA[smaharbA]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2911</uri>
			</author>
			<updated>2012-02-01T04:45:31Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=56241#p56241</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Image Catalyst]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=56235#p56235" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>lorents пишет:</cite><blockquote><p>…но там нет блокировки окна batch.</p></blockquote></div><p>Что под сим понимается? Поясните.</p><div class="quotebox"><cite>lorents пишет:</cite><blockquote><p>…и средствами сторонней улиты (главное чтобы оно было бесплатное).</p></blockquote></div><p>Попробуйте <a href="http://winreview.ru/winnity-dialog-vybora-papki-ili-fajla-iz-komandoj-stroki/">Winnity — диалог выбора папки или файла из командой строки</a>.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2012-01-31T22:55:23Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=56235#p56235</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Image Catalyst]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=56228#p56228" />
			<content type="html"><![CDATA[<p>Кстати, может у кого есть идеи как можно сделать запуск диалоговых окон выбора папки и файла(ов) для batch, который будет работать на windows XP/Vista/7. Способ ищу универсальной, главное требование, что диалоговые окна были поверх batch.<br />Видел пример реализованный средствами mshta, но там нет блокировки окна batch. Может кто знает другие способы, можно средствами vbs или js, можно и средствами сторонней улиты (главное чтобы оно было бесплатное).</p>]]></content>
			<author>
				<name><![CDATA[lorents]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27502</uri>
			</author>
			<updated>2012-01-31T20:10:53Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=56228#p56228</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Image Catalyst]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=56227#p56227" />
			<content type="html"><![CDATA[<p><strong>Аскет</strong><br />ни кто не жаловался на эти проблемы, надо будет разобраться<br />на счет комментариев, постараемся добавить</p><div class="quotebox"><cite>Аскет пишет:</cite><blockquote><p>Код вручную написан или с помощью чего-то?</p></blockquote></div><p>под полностью написан вручную</p>]]></content>
			<author>
				<name><![CDATA[lorents]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27502</uri>
			</author>
			<updated>2012-01-31T19:44:27Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=56227#p56227</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Image Catalyst]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=56226#p56226" />
			<content type="html"><![CDATA[<p>Да уж, простыня слишком объёмная.<br />Код вручную написан или с помощью чего-то?</p><p>Батник на 25 kb )))<br />EXE&#039;шник короче будет.<br />Код можно оптимизировать и сократить как минимум вдвое-втрое.</p><p>Ни единого комментария. Анализировать невозможно.<br />Вы уж поправьте - озаглавьте блоки кода, коротенько изложите алгоритм скрипта.</p><p><strong>Что касается явных ляпов.</strong><br />Отладку проводили?<br />Запускаю и вижу крокозябры.</p><p>Начнём сразу с начала.<br /></p><div class="codebox"><pre><code>&gt;nul chcp 866</code></pre></div><p>Тогда уж продолжайте в оных рамках, чего уж мелочиться-то. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br /></p><div class="quotebox"><blockquote><p>echo&nbsp; ЏаЁ«®¦Ґ­ЁҐ ­Ґ б¬®Ј«® Ї®«гзЁвм ¤®бвгЇ Є б«Ґ¤гойЁ¬ д ©« ¬:</p></blockquote></div><p>Правильно будет:<br /></p><div class="codebox"><pre><code>&gt;nul chcp 1251</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Аскет]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=25748</uri>
			</author>
			<updated>2012-01-31T19:26:10Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=56226#p56226</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Image Catalyst]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=56195#p56195" />
			<content type="html"><![CDATA[<p>Благодарю за замечания! Будем исправлять<br />если есть еще замечания, то пишите.</p>]]></content>
			<author>
				<name><![CDATA[lorents]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27502</uri>
			</author>
			<updated>2012-01-31T11:14:27Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=56195#p56195</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Image Catalyst]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=56164#p56164" />
			<content type="html"><![CDATA[<p>Скрипт большой. Разбираться в его логике - долго и вряд ли кто возьмется его вдумчиво исследовать. Я внимательно посмотрел несколько первых строк и вот что заметил.</p><p>Замечание 1.<br /></p><div class="codebox"><pre><code>if not exist &quot;%apps%advdef.exe&quot; set &quot;nofile=%nofile%advdef.exe &quot;
...
if not exist &quot;%scripts%xmlhttprequest.js&quot; set &quot;nofile=%nofile%xmlhttprequest.js &quot;
if defined nofile (</code></pre></div><p>Что случится, если переменная nofile каким-либо образом уже существует до запуска этого скрипта? -- Скрипт сработает некорректно. Поэтому необходимо переменную инициализировать:<br /></p><div class="codebox"><pre><code>set nofile=</code></pre></div><p>Следующий момент касается самого размера этой портянки. Нет смысла так расписывать ее. Лучше составьте список и пройдитесь по нему:<br /></p><div class="codebox"><pre><code>for %%n in ( advdef.exe ... xmlhttprequest.js ) do (
    if not exist &quot;%apps%%%n&quot; (
        rem сообщение об ошибке и выход из скрипта
    )
)</code></pre></div><p>Замечание 2<br />Неоднородный выход из скрипта<br /></p><div class="codebox"><pre><code>if defined nofile (
...
    pause&gt;nul &amp;    goto:eof
)</code></pre></div><div class="codebox"><pre><code>if &quot;%~1&quot; neq &quot;&quot; (
    set &quot;params=%*&quot;
) else (
...
    pause&gt;nul &amp; exit
)</code></pre></div><p>Мало того. exit, выполненный из скрипта, вызванного из командного процессора завершит и его. </p><p>Замечание 3<br />Аналогично первому. <br /></p><div class="codebox"><pre><code>for /f &quot;tokens=1&quot; %%i in (&#039;initool /f:&quot;%configpath%&quot; /s:&quot;jpeg&quot; /k:&quot;dc&quot; &#039;) do if /i &quot;%%~i&quot; equ &quot;true&quot; set &quot;sec-jpeg=-dc&quot;
for /f &quot;tokens=1&quot; %%i in (&#039;initool /f:&quot;%configpath%&quot; /s:&quot;jpeg&quot; /k:&quot;de&quot; &#039;) do if /i &quot;%%~i&quot; equ &quot;true&quot; set &quot;sec-jpeg=%sec-jpeg% -de&quot;
for /f &quot;tokens=1&quot; %%i in (&#039;initool /f:&quot;%configpath%&quot; /s:&quot;jpeg&quot; /k:&quot;di&quot; &#039;) do if /i &quot;%%~i&quot; equ &quot;true&quot; set &quot;sec-jpeg=%sec-jpeg% -di&quot;
for /f &quot;tokens=1&quot; %%i in (&#039;initool /f:&quot;%configpath%&quot; /s:&quot;jpeg&quot; /k:&quot;dx&quot; &#039;) do if /i &quot;%%~i&quot; equ &quot;true&quot; set &quot;sec-jpeg=%sec-jpeg% -dx&quot;
for /f &quot;tokens=1&quot; %%i in (&#039;initool /f:&quot;%configpath%&quot; /s:&quot;jpeg&quot; /k:&quot;du&quot; &#039;) do if /i &quot;%%~i&quot; equ &quot;true&quot; set &quot;sec-jpeg=%sec-jpeg% -du&quot;</code></pre></div><p>Замечание 4<br />waithreat. Имеется в виду waitthreat?</p><p>Что значит threat (угроза) в метках XXXthreat и threatXXX? Может быть thread (поток, нить)?</p>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2012-01-30T21:35:13Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=56164#p56164</id>
		</entry>
</feed>
