Поиск недокачанных изображений

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

SVM
Сообщения: 47
Зарегистрирован: Чт окт 16, 2008 16:36

Сообщение SVM »

Skif_off
хоткей я уже добавил.
Skif_off писал(а):А чем плох Alt+Tab?
Что-то я не нашёл, как с помощью Alt+Tab можно свернуть скрипт в трей.
Я не сварачиваемые окна сварачиваю с помощью Caesar, но такая функция в скрипте не помешала бы.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

SVM писал(а):Что-то я не нашёл, как с помощью Alt+Tab можно свернуть скрипт в трей.
Alt+Tab позволяет быстро переключать окна.
SVM
Сообщения: 47
Зарегистрирован: Чт окт 16, 2008 16:36

Сообщение SVM »

Skif_off
У меня во время проверки большого колличества jpeg файлов, скрипт иногда зависает. Висит в процессах, нагружая процессор на 50%, в это время JpegTran.exe из процессов изчезает.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

В качестве слабого компа выступал HP Pavilion dm1-4000er (только на аккумуляторе - сбалансированный/энергосберегающий режим + Avast)
- Снижена нагрузка на процессор со стороны AutoIt.exe - не более 2-4% максимум).
- Процесс jpegtran.exe считается зависшим спустя 30 секунд (подобрано подсчетом времени оптимизации больших файлов - пачки 50ти метровых JPEG (на одном из файлов (10843x6920) jpegtran.exe отожрал ~540 Мб ОЗУ, 200 Мб и 21672x13820 не прожевал, имейте в виду (в логе будет Insufficient memory (case 4))) после запуска и принудительно завершается с записью в лог.
- Возможно увеличение времени работы на большом количестве мелких (типа 20-200 кб) файлов, хотя на большом количестве типичных фоток с мыльницы, наоборот, наблюдал уменьшение времени на ~13%.
[cut="Скрипт:"]

Код: Выделить всё

#NoTrayIcon

#include <FileOperations.au3>
;Автор идеи Tol!k, батник: http://forum.wincmd.ru/viewtopic.php?p=56916#56916

Opt('WinWaitDelay', 100)

Global Const $tagPOINT = 'struct;long X;long Y;endstruct'
Global Const $HGDI_ERROR = Ptr(-1)
Global Const $INVALID_HANDLE_VALUE = Ptr(-1)
Global Const $KF_EXTENDED = 0x0100
Global Const $KF_ALTDOWN = 0x2000
Global Const $KF_UP = 0x8000
Global Const $LLKHF_EXTENDED = BitShift($KF_EXTENDED, 8)
Global Const $LLKHF_ALTDOWN = BitShift($KF_ALTDOWN, 8)
Global Const $LLKHF_UP = BitShift($KF_UP, 8)

;Обозвал локальными, т.к. скомпилированная версия иногда ругается
Local $sPathWithPic, $iD, $aFileList, $hFile, $recurs

#Region ;Обрабатываем командную строку, если пустая - появится окно выбора каталога
If $CmdLine[0] = 0 Then
    While 1
        $sPathWithPic = FileSelectFolder('Укажите каталог с изображениями', '', 4)
        If @error And $sPathWithPic = '' Then Exit
        If @error Or Not StringInStr(FileGetAttrib($sPathWithPic), "D") Then
            MsgBox(4096, 'JPGtest.au3', 'Вы указали "' & $sPathWithPic & '", а не каталог')
        Else
            ExitLoop
        EndIf
    WEnd
    Switch MsgBox(3 + 4096, 'JPGtest.au3', 'Проверить изображения только в этом каталоге? ' & _
        'Иначе - рекурсивно. Кнопка Отмена завершит работу скрипта.')
        Case 6
            $iD = 0
        Case 7
            $iD = 125
        Case 2
            Exit
    EndSwitch
ElseIf $CmdLine[0] = 1 Then
    $sPathWithPic = $CmdLine[1]
    $iD = 0
ElseIf $CmdLine[0] = 2 And $CmdLine[2] = 'recurs' Then
    $sPathWithPic = $CmdLine[1]
    $iD = 125
EndIf
#EndRegion

;Получаем массив со всеми файлами (или не получаем :))
$aFileList = _FO_FileSearch($sPathWithPic, 'jpg|jpeg|jpe', True, $iD, 1, 1, 2, 0)
If @error Then
    Switch @error
        Case 1
            MsgBox(4096, 'JPGtest.au3', 'Неверный путь!')
            Exit
        Case 2
            MsgBox(4096, 'JPGtest.au3', 'Неверная маска!')
            Exit
        Case 3
            MsgBox(4096, 'JPGtest.au3', 'Ничего не найдено!')
            Exit
    EndSwitch
EndIf

#Region ;Процесс пошел
;Удаляем старый лог и testtmp.jpg, если есть
If FileExists(@TempDir & '\jpgerror.txt') Then
    FileSetAttrib(@TempDir & '\jpgerror.txt', '-RASHNOT')
    FileDelete(@TempDir & '\jpgerror.txt')
EndIf
If FileExists(@TempDir & '\testtmp.jpg') Then
    FileSetAttrib(@TempDir & '\testtmp.jpg', '-RASHNOT')
    FileDelete(@TempDir & '\testtmp.jpg')
EndIf

;Создаем в %Temp% лог для поврежденных файлов (в UTF8 with BOM)
$hFile = FileOpen(@TempDir & '\jpgerror.txt', 1 + 128)
;Проверяем
If $hFile = -1 Then
    MsgBox(4096, 'JPGtest.au3 - Ошибка!', 'Невозможно открыть файл для записи лога.')
    Exit
EndIf

;Счетчик ошибок
$iCounterError = 0
$iHangsrError = 0

GUICreate('JPGtest.au3', 350, 150)
$FullFileName = GUICtrlCreateLabel('', 5, 5, 340, 120, 0x0000)
$StatusBar = GUICtrlCreateLabel('', 5, 128, 340, 17, 0x0000)
GUICtrlSetColor(-1, 0xff0000)
GUISetState()

For $i = 1 To $aFileList[0]
    GUICtrlSetData($FullFileName, $aFileList[$i])
    GUICtrlSetData($StatusBar, '*error/current/all: *' & $iCounterError & '/' & $i & '/' & $aFileList[0])
    $sOut = ''
    $iPID = Run(@ScriptDir & '\jpegtran.exe -optimize "' & $aFileList[$i] & '" "' & @TempDir & '\testtmp.jpg"', '', @SW_HIDE, 4)
    ProcessWaitClose($iPID, 30)
    If ProcessExists($iPID) Then
        ProcessClose($iPID)
        FileWriteLine($hFile, $aFileList[$i] & @TAB & 'процесс завис на этом файле, принудительно завершен')
        $iCounterError += 1
        ContinueLoop
    EndIf
    $sOut = StderrRead($iPID)
    If $sOut Then
        $sError = StringRegExpReplace($sOut, '[\r\n]+', ' ')
        FileWriteLine($hFile, $aFileList[$i] & @TAB & $sError)
        $iCounterError += 1
    EndIf
Next

FileClose($hFile)
GUIDelete()
#EndRegion

;Дополнение для результата
If $iD = 0 Then
    $recurs = ' (исключая подкаталоги) '
ElseIf $iD = 125 Then
    $recurs = ' (включая подкаталоги) '
EndIf

;Результат
If $iCounterError = 0 Then
    MsgBox(4096, 'JPGtest.au3', 'Скрипт завершил работу, поврежденные файлы в ' & _
        'каталоге "' & $sPathWithPic & '"' & $recurs & 'не найдены.')
Else
    Switch MsgBox(4 + 4096, 'JPGtest.au3', 'Скрипт завершил работу, в каталоге "' & _
        $sPathWithPic & '"' & $recurs & 'найдены поврежденные файлы: ' & _
        $iCounterError & '. Лог сохранен в "' & @TempDir & '", открыть?')
        Case 6
            ShellExecute(@TempDir & '\jpgerror.txt')
        Case 7
            Exit
    EndSwitch
EndIf
[/cut]
[cut="Для полной самодостаточности в конец скрипта скопировать из FileOperations.au3 функции:"]
_FO_FileSearch
__FO_GetListMask
__FO_UserLocale
__FO_FileSearchType
__FO_FileSearchMask
__FO_FileSearchAll
__ChExcludeFolders
__FO_MaskUnique (перед функцией добавить директиву #Obfuscator_Off на случай компиляции)
[/cut]
З.Ы. На нормальном, достаточно современном десктопе с не самыми медленными хардами и более чем одним ядром (антивируснику же надо нагнуть систему), можно попробовать поставить Opt('WinWaitDelay', 50): выигрыш от 2% и далее на разнородных файлах (ну и на большом количестве).
Последний раз редактировалось Skif_off Вт окт 07, 2014 10:32, всего редактировалось 2 раза.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Если кому-нибудь интересно: проверил работу с over MAX_PATH - нормально
[cut="с небольшим изменением скрипта"]

Код: Выделить всё

;нужно заменить
$aFileList = _FO_FileSearch($sPathWithPic, 'jpg|jpeg|jpe', True, $iD, 1, 1, 2, 0)
;на
$aFileList = _FO_FileSearch('\\?\' & $sPathWithPic, 'jpg|jpeg|jpe', True, $iD, 1, 1, 2, 0)
[/cut]
(предполагается, что скрипт, jpegtran.exe и начальный каталог лежат в пределах MAX_PATH), но только на Win7 (и выше, вероятно) :( На WinXP SP(2|3) не срабатывает, если путь длиннее MAX_PATH, ищу решение, возможно - тупо прикручу проверку версии ОС. Или забить и просто чуть изменить текст ошибки на Can't open file for reading (Unicode or MAX_PATH?), т.к. с префиксом "\\?\" всё равно работает.

Кстати, с умляутами и вообще юникодом jpegtran.exe не сработает, в лог попадет запись вида:
%путь к jpegtran%\jpegtran.exe: can't open \\?\%путь к файлу%\%имя файла с заменой проблемных символов на похожий из класс. латиницы%.jpg for reading
С случае ещё и длинных путей получается ппц: на тестовой папке в лог попала строка с 753 символами, чтобы подсократить,
[cut="можно"]

Код: Выделить всё

;заменить
    If $sOut Then
        $sError = StringRegExpReplace($sOut, '[\r\n]+', ' ')
        FileWriteLine($hFile, $aFileList[$i] & @TAB & $sError)
        $iCounterError += 1
    EndIf
;на
    If $sOut Then
        If StringInStr($sOut, "jpegtran.exe: can't open") Then
            FileWriteLine($hFile, $aFileList[$i] & @TAB & "Can't open file for reading (Unicode?)")
            $iCounterError += 1
        Else
            $sError = StringRegExpReplace($sOut, '[\r\n]+', ' ')
            FileWriteLine($hFile, $aFileList[$i] & @TAB & $sError)
            $iCounterError += 1
        EndIf
    EndIf
[/cut]
Как скажется на скорости - не проверял.
SVM
Сообщения: 47
Зарегистрирован: Чт окт 16, 2008 16:36

Сообщение SVM »

Skif_off
Хорошо если было бы возможно переместить найденные недокаченные фотографии с сохранением структуры папок, через gui или например, как в CloneSpy создавался bat файл.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

SVM
В jpgerror.txt между именем файла и текстом ошибки вставляется табуляция, как раз на случай использования в качестве разделителя в любом табличном процессоре (LibreOffice Calc/Microsoft Excel/PlanMaker (SoftMaker Office)/Spread32), но это, конечно, если только вручную.
Надо подумать, но перемещение - это запись на носитель, если только опцию с копированием.

И не все будут недокачанными - что-то не получится открыть из-за размера или длинного пути, как минимум: не искал все сообщения jpegtran, только то, что можно смоделировать переименованием и HEX-редактором (пока тестировал).
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Усложнён обработчик ошибок для диалога выбора каталога, теперь сразу вылезет сообщение об ошибке и будет предложено повторить, если пользователь вдруг промахнётся и выберет "Компьютер", "Панель управления" или что-то в этом духе.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Скрипт AutoIt:
- заново сделан GUI;
- в поле ввода пути поддерживается drag and drop;
- закрытие необходимо подтверждать (дважды случайно закрыл);
- несколько ускорена проверка (ошибка не пишется сразу в файл, а добавляется в переменную и записывается всё разом);
- префикс для длинных путей (больше MAX_PATH) используется по умолчанию (на WinXP путь обрезается, решение (пока) не нашёл, разработчикам jpegtran писал - не ответили);
- добавлена возможность использовать файл-список (например, результат поиска): *.tmp для ТС и *.lst для DC, список должен быть в UTF-16LE;
- скрипты нумеруются начиная с 1, на случай запуска нескольких копий (число дописывается в имена временных и лог-файлов, в заголовок окна и заголовки сообщений).

Скрипт сделан полностью самодостаточным, писалось и проверялось с AutoIt версии 3.3.8.1.

Все временные файлы создаются в %Temp%, чтобы исключить запись на носитель (в WinPE в случае нештатного завершения работы ОС лог будет потерян).
Закрытие скрипта крестиком или Alt+F4 просто завершит его работу, прерывание задания только клавишей Esc! В этом случае будет показан результат на текущий момент.

Остальное, включая список поддерживаемых параметров запуска см. в комментариях в начале скрипта. Смотрите примечание!
[cut="Скрипт"]

Код: Выделить всё

;Автор идеи Tol!k, батник: http://forum.wincmd.ru/viewtopic.php?p=56916#56916
;Скрипт AutoIt http://forum.wincmd.ru/viewpost.php?p=112570
;2018.04.23
;Писалось и проверялось с AutoIt версии 3.3.8.1
;
;Описание:
;  Скрипт для проверки файлов JPEG (поиск повреждённых и/или недокаченных), при проверке происходит попытка оптимизация таблицы Хаффмана с помощью jpegtran.
;jpegtran.exe должен лежать рядом со скриптом.
;
;Возможности, нюансы:
;1. Возможно использовать jpegtran из проекта libjpeg-turbo (https://libjpeg-turbo.org/Main/HomePage), даёт существенный прирост скорости.
;   Версии под Win могут быть скомпилированы GCC (в MinGW/MinGW-w64) или в Visual C++ (2008 и выше), требуется второе.
;   Положить в подкаталоги рядом со скриптом:
;     libjpeg-turbo-vc\jpegtran.exe
;     libjpeg-turbo-vc64\jpegtran.exe
;   При выборе libjpeg-turbo на x64 ОС автоматически будет выбрана х64 версия jpegtran (если доступна).
;   Если опция выбрана, но исполняемые файлы не найдены, то будет использоваться jpegtran.exe рядом со скриптом.
;2. В поле ввода пути поддерживается drag and drop.
;3. В поле ввода можно использовать переменные окружения.
;4. Возможно использовать файл-список (например, результат поиска): *.tmp для ТС и *.lst для DC, список должен быть в UTF-16LE.
;5. Возможно указать имена папок для исключения из поиска, формат записи:
;     ваша папка для поиска|папка для исключения1|папка для исключения2
;   или
;     полный путь к файлу-списку|папка для исключения1|папка для исключения2
;   Имя папки для исключения ищется в любом месте полного имени файла!
;   В поле ввода кавычки не нужны, а при запуске с параметрами необходимо брать в кавычки всю эту строку целиком.
;6. Закрытие окна и прерывание задания (нчать с того же места не получится) необходимо подтверждать.
;7. Нажатия клавиш в окне: Shift+Enter - аналог кнопки Выполнить, Esc - прерывает проверку (без закрытия окна).
;8. Префикс "\\?\" для длинных путей (больше MAX_PATH) используется по умолчанию (на WinXP путь всё равно обрезается, решение (пока) не нашёл, разработчикам jpegtran писал - не ответили).
;   При необходимости можно попробовать каталог с изображениями подключить как диск:
;     subst [выбранная свободная буква:] [полный путь к каталогу]
;9. Возможно писать результат в nul (может быть быстрее + экономия записи на HDD).
;   Проверено в WinXP SP3 и Win7x64, но без 100%-й гарантии.
;10. Есть возможность сгенерировать cmd-файлы для копирования (с созданием дерева каталогов) и удаления файлов, попавших в лог (см. примечания!).
;   Для создания дерева каталогов необходимо, чтобы была включена расширенная обработка команд (обычно включено по умолчанию на Win2000/WinXP и выше), на всякий случай в cmd-файл копирования дописывается "SetLocal EnableExtensions".
;11. Скрипты нумеруются начиная с 1, на случай запуска нескольких копий, число дописывается в имена временных и лог-файлов, в заголовок окна и заголовки сообщений.
;
;Скрипт поддерживает параметры командной строки:
;   "path" - путь к каталогу или файлу-списку (в UTF-16LE!);
;   --recurs - рекурсивно;
;   --nul    - писать результат в nul;
;   --turbo  - использовать libjpeg-turbo.
;Синтаксис регистрозависимый!
;
;ПРИМЕЧАНИЕ: В лог-файл могут попасть не только повреждённые файлы, это могут быть:
;  - файлы, на которых Jpegtran по какой-то причине завис;
;  - очень большие файлы, для обработки которых недостаточно памяти (Jpegtran 32-хбитный);
;  - файлы, в полном имени которых содержатся символы вне текущей системной неюникодной локали (Jpegtran не поддерживает юникод).
;Проверяйте лог!
;ПРИМЕЧАНИЕ: То, что файл с проблемами, не значит, что он повреждён фатально и нельзя попробовать открыть его в графическом редакторе и пересохранить.
;
#NoTrayIcon

Opt('WinWaitDelay', 100)
Opt('GUICloseOnESC', 0)
Opt('MustDeclareVars', 1)

Global Const $GUI_CHECKED = 1
Global Const $GUI_EVENT_CLOSE = -3
Global Const $GUI_EVENT_MINIMIZE = -4
Global Const $GUI_DROPACCEPTED = 8
Global Const $GUI_ENABLE = 64
Global Const $GUI_DISABLE = 128
Global Const $WS_EX_ACCEPTFILES = 0x00000010
Global Const $SS_RIGHT = 0x2

Local $sTemp, $iNum = 1, $iFE86 = 0, $iFE64 = 0, $iJT = 0, $iD = 0, $hGui, $L0, $L1, $L2, $Input, $B1, $C1, $C2, $C3, $L2, $L3, $L4, $B2, $B3, $B4, $Dummy
Global $fStartWork = False

;Определяем папку для временного файла и лога
$sTemp = EnvGet('TEMP')
;Проверяем существование окон для индекса $iNum
While 1
    Sleep(25)
    If Not WinExists('FileTest - ' & @ScriptName & ' (' & $iNum & ')') Then
        If FileExists($sTemp & '\jpegtest' & $iNum & '.log') Then
            $iNum += 1
            ContinueLoop
        Else
            ExitLoop
        EndIf
    Else
        $iNum += 1
        ContinueLoop
    EndIf
WEnd
;Проверяем параметры запуска
If $CmdLine[0] > 4 Then
    MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ')', 'Проверьте параметры запуска!' & @CRLF & @CRLF & _
    'Допустимы:' & @CRLF & _
       '   "path": каталог с изображениями или путь к файлу списка;' & @CRLF & _
       '    --recurs: рекурсивно;' & @CRLF & _
       '    --nul: писать результат в nul;' & @CRLF & _
       '    --turbo: использовать libjpeg-turbo.')
EndIf
;Проверяем наличие jpegtran.exe
If Not FileExists(@ScriptDir & '\jpegtran.exe') Then
    MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ') - Ошибка!', 'Файл "jpegtran.exe" не найден!' & @CRLF & 'Выходим.')
    Exit
EndIf
If FileExists(@ScriptDir & '\libjpeg-turbo-vc\jpegtran.exe') Then
    $iJT = 1
    $iFE86 = 1
EndIf
If FileExists(@ScriptDir & '\libjpeg-turbo-vc64\jpegtran.exe') Then
    $iJT += 1
    $iFE64 = 1
EndIf

__GUI()

Func __GUI()
    Opt('GUIOnEventMode', 1) ;режим OnEvent
    $hGui = GUICreate('FileTest - ' & @ScriptName & ' (' & $iNum & ')', 400, 240, -1, -1, -1, $WS_EX_ACCEPTFILES)
    GUISetOnEvent($GUI_EVENT_CLOSE, '__OnExit')
    GUISetOnEvent($GUI_EVENT_MINIMIZE, '__OnMinimize')
    $L0 = GUICtrlCreateLabel('Каталог или файл-список с изображениями (drag-and-drop работает):', 14, 8, 360, 22)
    $Input = GUICtrlCreateInput('', 8, 26, 360, 22) ;принимает перетаскиваемые в Input файлы (drag and drop)
    GUICtrlSetState($Input, $GUI_DROPACCEPTED)
    $B1 = GUICtrlCreateButton('...', 372, 26, 22, 22)
    GUICtrlSetOnEvent($B1, '__OnClickB1')
    $L1 = GUICtrlCreateLabel('Форматы: *.jpg, *.jpeg, *.jpe', 120, 50, 170, 22)
    GUICtrlSetColor($L1, 0x4b4b4b)
    $C1 = GUICtrlCreateCheckbox('Рекурсивно', 14, 62, 100, 22)
    $C2 = GUICtrlCreateCheckbox('Результат в nul', 14, 86, 120, 22)
    $C3 = GUICtrlCreateCheckbox('libjpeg-turbo (автовыбор x32/x64)', 140, 86, 206, 22)
    GUICtrlCreateGroup('Статус:', 10, 116, 300, 66)
    $L2 = GUICtrlCreateLabel('всего файлов / номер текущего / *с ошибкой:', 20, 136, 270, 22)
    GUICtrlSetColor($L2, 0x4b4b4b)
    $L3 = GUICtrlCreateLabel('', 22, 156, 90, 22, $SS_RIGHT)
    $L4 = GUICtrlCreateLabel('', 120, 156, 168, 22)
    ;GUICtrlSetColor($L4, 0xff0000)
    GUICtrlCreateGroup('..', -99, -99, 1, 1) ;закрывает группу
    $B2 = GUICtrlCreateButton('Выполнить', 320, 116, 70, 30)
    GUICtrlSetOnEvent($B2, '__StartWork')
    $B3 = GUICtrlCreateButton('Выход', 320, 156, 70, 30)
    GUICtrlSetOnEvent($B3, '__OnExit')
    $B4 = GUICtrlCreateButton('Создать cmd-файлы копирования/удаления', 20, 190, 280, 24)
    GUICtrlSetOnEvent($B4, '__GenCMDFiles')
    GUICtrlSetState($B4, $GUI_DISABLE)
    $L2 = GUICtrlCreateLabel('Для остановки проверки используйте клавишу Esc!', 5, 225, 305, 20)
    GUICtrlSetColor($L2, 0x800000)
    $Dummy = GUICtrlCreateDummy()
    GUICtrlSetOnEvent($Dummy, '__StartWork')
    Local $aAccelKeys[2][2] = [['{Esc}', $Dummy],['+{Enter}', $B2]]
    GUISetAccelerators($aAccelKeys)
    If $iJT = 0 Then GUICtrlSetState($C3, $GUI_DISABLE)
    If $CmdLine[0] > 0 Then
        For $i = 1 To $CmdLine[0]
            If $CmdLine[$i] <> '--recurs' And $CmdLine[$i] <> '--nul' And $CmdLine[$i] <> '--turbo' Then
                GUICtrlSetData($Input, $CmdLine[$i])
                ContinueLoop
            EndIf
            If $CmdLine[$i] == '--recurs' Then
                GUICtrlSetState($C1, 1)
                $iD = 125
                ContinueLoop
            EndIf
            If $CmdLine[$i] == '--nul' Then
                GUICtrlSetState($C2, 1)
                ContinueLoop
            EndIf
            If $CmdLine[$i] == '--turbo' Then
                If $iJT > 0 Then GUICtrlSetState($C3, 1)
                ContinueLoop
            EndIf
        Next
    EndIf
    GUISetState()
    While 1
        GUICtrlSetOnEvent($Dummy, '')
        If $fStartWork = True Then
            $fStartWork = False
            If StringLen(GUICtrlRead($Input)) < 1 Then
                MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ') - Ошибка!', 'Поле ввода пустое!')
            Else
                __Work(GUICtrlRead($Input))
            EndIf
        EndIf
        Sleep(50)
    WEnd
EndFunc   ;==>__GUI

Func __StartWork()
    $fStartWork = True
EndFunc

Func __OnExit()
    If MsgBox(4 + 48 + 4096, 'JPEGtest (' & $iNum & ')', 'Действительно закрыть?', '', $hGui) = 6 Then Exit
EndFunc

Func __OnMinimize()
    GUISetState(@SW_MINIMIZE, $hGui)
EndFunc

Func __OnClickB1()
    GUICtrlSetData($Input, __SelectFolder())
EndFunc

Func __SelectFolder()
    Local $sPath
    While 1
        $sPath = FileSelectFolder('Укажите каталог с изображениями', '', 2 + 4, '', $hGui)
        If @error And $sPath = '' Then ExitLoop
        If @error Or Not StringInStr(FileGetAttrib($sPath), 'D') Then
            MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ')', 'Вы указали "' & $sPath & '", а не каталог!', '', $hGui)
        Else
            ExitLoop
        EndIf
    WEnd
    Return $sPath
EndFunc   ;==>__SelectFolder

Func __Work($sPath)
    Local $sExcludeFolders, $aFileList, $hFile, $sFile, $sD, $lst, $sUtil = @ScriptDir & '\jpegtran.exe', $sResult, $i, $iPID, $sOut = '', $sError = '', $iError = 0, $sAllErrs = '', $iExit = 0
    If BitAND(GUICtrlRead($C1), $GUI_CHECKED) = $GUI_CHECKED Then $iD = 125
    ;Local $timer = TimerInit()
    $sPath = _WinAPI_ExpandEnvironmentStrings($sPath)
    If StringInStr($sPath, '|', 1) Then
        $sExcludeFolders = StringRegExpReplace($sPath, '^[^\|]+\|', '', 1)
        $sPath = StringRegExpReplace($sPath, '^([^\|]+)(\|.*)$', '\1', 1)
    Else
        $sExcludeFolders = ''
    EndIf
    If Not StringRegExp($sPath, '^[A-Za-z]:\\$', 0) Then
        $sPath = StringRegExpReplace($sPath, '(?m)\\$', '')
    EndIf
    If Not FileExists($sPath) Then
        MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ')', '"' & $sPath & '"' & @CR & 'не найден!', '', $hGui)
        Return 0
    EndIf
    GUICtrlSetData($L3, '')
    GUICtrlSetData($L4, '')
    GUICtrlSetState($Input, $GUI_DISABLE)
    GUICtrlSetState($C1, $GUI_DISABLE)
    GUICtrlSetState($C2, $GUI_DISABLE)
    GUICtrlSetState($C3, $GUI_DISABLE)
    GUICtrlSetState($B1, $GUI_DISABLE)
    GUICtrlSetState($B2, $GUI_DISABLE)
    GUICtrlSetState($B3, $GUI_DISABLE)
    GUICtrlSetState($B4, $GUI_DISABLE)
    GUICtrlSetOnEvent($Dummy, '__StartWork')
    ;Получаем массив со всеми файлами (или не получаем :))
    If StringRegExp($sPath, '(?im)\.(tmp|lst)$') Then
        ;Открываем и читаем файл-список
        $hFile = FileOpen($sPath, 0 + 32)
        If $hFile = -1 Then
            MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ') - Ошибка!', 'Не удалось открыть файл-список.', '', $hGui)
            GUICtrlSetState($Input, $GUI_ENABLE)
            GUICtrlSetState($C1, $GUI_ENABLE)
            GUICtrlSetState($C2, $GUI_ENABLE)
            If $iJT > 0 Then
                GUICtrlSetState($C3, $GUI_ENABLE)
            EndIf
            GUICtrlSetState($B1, $GUI_ENABLE)
            GUICtrlSetState($B2, $GUI_ENABLE)
            GUICtrlSetState($B3, $GUI_ENABLE)
            Return 0
        EndIf
        $sFile = FileRead($hFile)
        FileClose($hFile)
        ;Проверяем конец строки - DOS/Unix/Mac
        Select
           Case StringInStr($sFile, @CRLF) > 0
               $sD = @CRLF
           Case StringInStr($sFile, @LF) > 0
               $sD = @LF
           Case Else
               $sD = @CR
        EndSelect
        ;Убираем пустую строку в конце, если есть:
        $sFile = StringStripWS($sFile, 2)
        ;Добавляем префикс \\?\
        $sFile = StringRegExpReplace($sFile, '(?ms)^([^\r\n])', '\\\\?\\\1')
        ;Помещаем строки в массив
        $aFileList = StringSplit($sFile, $sD, 1)
        $sFile = ''
    Else
        $aFileList = _FO_FileSearch('\\?\' & $sPath, 'jpg|jpeg|jpe', True, $iD, 1, 1, 2, 0, $sExcludeFolders, -1)
        If @error Then
            Switch @error
                Case 1
                    MsgBox(16 + 4096, 'JPEGTest.au3 - _FO_FileSearch():', 'Неверный путь!', '', $hGui)
                Case 2
                    MsgBox(16 + 4096, 'JPEGTest.au3 - _FO_FileSearch():', 'Неверная маска!', '', $hGui)
                Case 3
                    MsgBox(16 + 4096, 'JPEGTest.au3 - _FO_FileSearch():', 'Ничего не найдено!', '', $hGui)
            EndSwitch
            GUICtrlSetState($Input, $GUI_ENABLE)
            GUICtrlSetState($C1, $GUI_ENABLE)
            GUICtrlSetState($C2, $GUI_ENABLE)
            If $iJT > 0 Then
                GUICtrlSetState($C3, $GUI_ENABLE)
            EndIf
            GUICtrlSetState($B1, $GUI_ENABLE)
            GUICtrlSetState($B2, $GUI_ENABLE)
            GUICtrlSetState($B3, $GUI_ENABLE)
            Return 0
        EndIf
    EndIf
    GUICtrlSetData($L3, $aFileList[0])
    $hFile = FileOpen($sTemp & '\jpegtest' & $iNum & '.log', 2 + 128)
    If $hFile = -1 Then
        MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ') - Ошибка!', 'Не удалось открыть файл для записи лога.', '', $hGui)
        Return 0
    EndIf
    ;
    If $iJT > 0 And BitAND(GUICtrlRead($C3), $GUI_CHECKED) = $GUI_CHECKED Then
        Select
            Case @OSArch = 'X64' And $iFE64 = 1
                $sUtil = @ScriptDir & '\libjpeg-turbo-vc64\jpegtran.exe'
            Case @OSArch = 'X64' And $iFE86 = 1
                $sUtil = @ScriptDir & '\libjpeg-turbo-vc\jpegtran.exe'
            Case @OSArch = 'X86' And $iFE86 = 1
                $sUtil = @ScriptDir & '\libjpeg-turbo-vc\jpegtran.exe'
        EndSelect
    EndIf
    If BitAND(GUICtrlRead($C2), $GUI_CHECKED) = $GUI_CHECKED Then
        $sResult = 'nul'
    Else
        $sResult = '"' & $sTemp & '\jpegtest' & $iNum & '.jpg"'
    EndIf
    ;Цикл проверки
    For $i = 1 To $aFileList[0]
        If $fStartWork = True Then
            $fStartWork = False
            If MsgBox(4 + 48 + 4096, 'JPEGtest (' & $iNum & ')', 'Действительно прервать?', '', $hGui) = 6 Then
                $iExit = 1
                ExitLoop;
            EndIf
        EndIf
        GUICtrlSetData($L4, $i & ' / *' & $iError)
        $sOut = ''
        $iPID = Run('"' & $sUtil & '" -optimize -outfile ' & $sResult & ' "' & $aFileList[$i] & '"', @ScriptDir, @SW_HIDE, 4)
        ProcessWaitClose($iPID, 30)
        If ProcessExists($iPID) Then
            ProcessClose($iPID)
            $sAllErrs &= $aFileList[$i] & @TAB & 'процесс завис на этом файле, принудительно завершен' & @CRLF
            $iError += 1
            ContinueLoop
        EndIf
        $sOut = StderrRead($iPID)
        If $sOut Then
            If StringInStr($sOut, "jpegtran.exe: can't open") Then
                $sAllErrs &= $aFileList[$i] & @TAB & "Can't open file for reading (Unicode or long path?)" & @CRLF
                $iError += 1
            Else
                $sError = StringRegExpReplace($sOut, '[\r\n]+', ' ')
                $sAllErrs &= $aFileList[$i] & @TAB & $sError & @CRLF
                $iError += 1
                $sError = ''
            EndIf
        EndIf
    Next
    If $sAllErrs Then
        $sAllErrs = StringReplace($sAllErrs, '\\?\', '', 0, 1)
        FileWrite($hFile, $sAllErrs)
    EndIf
    FileClose($hFile)
    FileSetAttrib($sTemp & '\jpegtest' & $iNum & '.jpg', '-RST')
    FileDelete($sTemp & '\jpegtest' & $iNum & '.jpg')
    ;MsgBox(4096, 'Время выполнения', 'Время: ' & TimerDiff($timer) & ' мс')
    ;Результат
    Select
        Case $iExit = 1
            If $iError = 0 Then
                MsgBox(64 + 4096, 'JPEGtest (' & $iNum & ')', 'Проверка была прервана, ошибок: 0', '', $hGui)
                FileSetAttrib($sTemp & '\jpegtest' & $iNum & '.log', '-RST')
                FileDelete($sTemp & '\jpegtest' & $iNum & '.log')
            Else
                If MsgBox(4 + 64 + 4096, 'JPEGtest (' & $iNum & ')', 'Проверка была прервана, ошибок: ' & _
                          $iError & '.' & @CR & @CR & 'Лог сохранен в "' & $sTemp & '", открыть?', '', $hGui) = 6 Then
                    ;__OpenLog($sTemp & '\jpegtest' & $iNum & '.log')
                    ShellExecute($sTemp & '\jpegtest' & $iNum & '.log')
                EndIf
                GUICtrlSetState($B4, $GUI_ENABLE)
            EndIf
            GUICtrlSetState($Input, $GUI_ENABLE)
            GUICtrlSetState($C1, $GUI_ENABLE)
            GUICtrlSetState($C2, $GUI_ENABLE)
            If $iJT > 0 Then
                GUICtrlSetState($C3, $GUI_ENABLE)
            EndIf
            GUICtrlSetState($B1, $GUI_ENABLE)
            GUICtrlSetState($B2, $GUI_ENABLE)
            GUICtrlSetState($B3, $GUI_ENABLE)
            Return 2
        Case $iExit = 0
            If $iError = 0 Then
                MsgBox(64 + 4096, 'JPEGtest (' & $iNum & ')', 'Проверка завершена, ошибок: 0', '', $hGui)
                FileSetAttrib($sTemp & '\jpegtest' & $iNum & '.log', '-RST')
                FileDelete($sTemp & '\jpegtest' & $iNum & '.log')
            Else
                Switch MsgBox(4 + 64 + 4096, 'JPEGtest (' & $iNum & ')', 'Проверка завершена, ошибок: ' & _
                          $iError & '.' & @CR & @CR & 'Лог сохранен в "' & $sTemp & '", открыть?', '', $hGui)
                    Case 6
                        ;__OpenLog($sTemp & '\jpegtest' & $iNum & '.log')
                        ShellExecute($sTemp & '\jpegtest' & $iNum & '.log')
                EndSwitch
                GUICtrlSetState($B4, $GUI_ENABLE)
            EndIf
            GUICtrlSetState($Input, $GUI_ENABLE)
            GUICtrlSetState($C1, $GUI_ENABLE)
            GUICtrlSetState($C2, $GUI_ENABLE)
            If $iJT > 0 Then
                GUICtrlSetState($C3, $GUI_ENABLE)
            EndIf
            GUICtrlSetState($B1, $GUI_ENABLE)
            GUICtrlSetState($B2, $GUI_ENABLE)
            GUICtrlSetState($B3, $GUI_ENABLE)
            Return 1
    EndSelect
EndFunc   ;==>__Work

Func __GenCMDFiles()
    Local $sPath, $iFlag = 0, $sNote, $sMkDir = '|', $sCopy = '', $hFile, $sFile, $sD, $aList, $i, $sTName, $sTDir, $sTmp, $sTmp2 = '', $aRet, $sDos
    GUICtrlSetState($B4, $GUI_DISABLE)
    ;Примечание для батников
    $sNote = 'rem ПРИМЕЧАНИЕ: В лог-файл могут попасть не только поврежденные файлы, это могут быть:' & @CRLF & _
            'rem   - файлы, на которых Jpegtran по какой-то причине завис;' & @CRLF & _
            'rem   - очень большие файлы, для обработки которых недостаточно памяти (Jpegtran 32-хбитный);' & @CRLF & _
            'rem   - файлы, в полном имени которых содержатся символы вне текущей системной неюникодной локали (Jpegtran не поддерживает юникод).' & @CRLF & _
            'rem Проверяйте лог!' & _
            'rem ПРИМЕЧАНИЕ: То, что файл с проблемами, не значит, что он повреждён фатально и нельзя попробовать открыть его в графическом редакторе и пересохранить.' & @CRLF & @CRLF
    ;Проверяем наличие файла лога
    If Not FileExists($sTemp & '\jpegtest' & $iNum & '.log') Then
        MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ') - Ошибка!', 'Не найден файл лога jpegtest' & $iNum & '.log!', '', $hGui)
        Return -1
    EndIf
    ;Получаем путь назначения
    While 1
        $sPath = FileSelectFolder('Укажите каталог назначения:', '', 1 + 2 + 4, '', $hGui)
        If @error And $sPath = '' Then ExitLoop
        If @error Or Not StringInStr(FileGetAttrib($sPath), 'D') Then
            MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ')', 'Вы указали "' & $sPath & '", а не каталог!', '', $hGui)
        Else
            ExitLoop
        EndIf
    WEnd
    If StringLen($sPath) < 3 Then Return -2
    ;Уточняем флаг открытия файла (для правильной работы на 3.3.14.0 и выше)
    If StringReplace(@AutoItVersion, '.', '') >= 33140 Then $iFlag += 512
    ;Открываем и читаем лог
    $hFile = FileOpen($sTemp & '\jpegtest' & $iNum & '.log', 0 + 128)
    If $hFile = -1 Then
        MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ') - Ошибка!', 'Не удалось открыть для чтения файл лога jpegtest' & $iNum & '.log!', '', $hGui)
        Return -3
    EndIf
    $sFile = FileRead($hFile)
    FileClose($hFile)
    ;Проверяем конец строки - DOS/Unix/Mac
    Select
       Case StringInStr($sFile, @CRLF) > 0
           $sD = @CRLF
       Case StringInStr($sFile, @LF) > 0
           $sD = @LF
       Case Else
           $sD = @CR
    EndSelect
    ;Убираем пустую строку в конце, если есть:
    $sFile = StringStripWS($sFile, 2)
    ;Убираем причину
    $sFile = StringRegExpReplace($sFile, '(?m)^([^\r\n\t]+)(\t)([^\r\n]+)', '\1')
    ;Убираем префикс
    $sFile = StringRegExpReplace($sFile, '(?m)^\\\\\?\\', '')
    ;Помещаем строки в массив
    $aList = StringSplit($sFile, $sD, 1)
    ;Генерируем батник копирования (с созданием дерева каталогов)
    For $i = 1 To $aList[0]
        $sTName = StringReplace($aList[$i], ':\', '\')
        $sTName = StringReplace($sPath & '\' & $sTName, '\\', '\')
        $sTDir = StringRegExpReplace($sTName, '\\[^\\]*$', '')
        If Not StringInStr($sMkDir, '|' & $sTDir & '|') Then
            $sMkDir &= $sTDir
            $sMkDir &= '|'
        EndIf
        $sTmp = 'copy "' & $aList[$i] & '" "' & $sTName & '"'
        $sCopy &= $sTmp
        $sCopy &= @CRLF
    Next
    $sMkDir = StringTrimRight(StringTrimLeft($sMkDir, 1), 1)
    $sMkDir = StringReplace($sMkDir, '|', '"' & @CRLF & 'mkdir "')
    $sTmp = $sNote & 'SetLocal EnableExtensions' & @CRLF & 'mkdir "' & $sMkDir & '"' & @CRLF & $sCopy
    $hFile = FileOpen($sPath & '\jpegtest_copy' & $iNum & '.cmd', 2 + $iFlag)
    $aRet = DllCall('user32.dll', 'bool', 'CharToOemA', 'str', $sTmp, 'str', '')
    $sDos = $aRet[2]
    FileWrite($hFile, $sDos)
    FileClose($hFile)
    ;Генерируем батник удаления
    For $i = 1 To $aList[0]
        $sTmp2 &= 'del /f /q "'
        $sTmp2 &= $aList[$i]
        $sTmp2 &= '"'
        $sTmp2 &= @CRLF
    Next
    $hFile = FileOpen($sPath & '\jpegtest_delete' & $iNum & '.cmd', 2 + $iFlag)
    $aRet = DllCall('user32.dll', 'bool', 'CharToOemA', 'str', $sNote & $sTmp2, 'str', '')
    $sDos = $aRet[2]
    FileWrite($hFile, $sDos)
    FileClose($hFile)
    MsgBox(64 + 4096, 'JPEGtest (' & $iNum & ')', 'Готово!')
    GUICtrlSetState($B4, $GUI_ENABLE)
EndFunc   ;==>__GenCMDFiles

#Region ;UDF
;WinAPI.au3
Func _WinAPI_ExpandEnvironmentStrings($sString)
    Local $aResult = DllCall("kernel32.dll", "dword", "ExpandEnvironmentStringsW", "wstr", $sString, "wstr", "", "dword", 4096)
    If @error Then Return SetError(@error, @extended, "")
    Return $aResult[2]
EndFunc   ;==>_WinAPI_ExpandEnvironmentStrings

;FileOperations.au3, 1.8.5 (2014.05.26) Edited version!
Func _FO_FileSearch($sPath, $sMask = '*', $fInclude = True, $iDepth = 125, $iFull = 1, $iArray = 1, $iTypeMask = 1, $sLocale = 0, $vExcludeFolders = '', $iExcludeDepth = -1)
    Local $vFileList
    If $sMask = '|' Then Return SetError(2, 0, '')
    If Not FileExists($sPath) Then Return SetError(1, 0, '')
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    If $vExcludeFolders Then
        $vExcludeFolders = StringSplit($vExcludeFolders, '|')
    Else
        Dim $vExcludeFolders[1] = [0]
    EndIf
    __FO_FileSearchType($vFileList, $sPath, '|' & $sMask & '|', $fInclude, $iDepth, $vExcludeFolders, $iExcludeDepth)
    If Not $vFileList Then Return SetError(3, 0, '')
    $vFileList = StringTrimRight($vFileList, 2)
    $vFileList = StringSplit($vFileList, @CRLF, 1)
    Return $vFileList
EndFunc   ;==>_FO_FileSearch

Func __FO_FileSearchType(ByRef $sFileList, $sPath, $sMask, ByRef $fInclude, ByRef $iDepth, ByRef $aExcludeFolders, ByRef $iExcludeDepth, $iCurD = 0)
    Local $iPos, $sFile, $s = FileFindFirstFile($sPath & '*')
    If $s = -1 Then Return
    While 1
        $sFile = FileFindNextFile($s)
        If @error Then ExitLoop
        If @extended Then
            If $iCurD >= $iDepth Or ($iCurD <= $iExcludeDepth And __ChExcludeFolders($sFile, $aExcludeFolders)) Then ContinueLoop
            __FO_FileSearchType($sFileList, $sPath & $sFile & '\', $sMask, $fInclude, $iDepth, $aExcludeFolders, $iExcludeDepth, $iCurD + 1)
        Else
            $iPos = StringInStr($sFile, ".", 0, -1)
            If $iPos And StringInStr($sMask, '|' & StringTrimLeft($sFile, $iPos) & '|') = $fInclude Then
                $sFileList &= $sPath & $sFile & @CRLF
            ElseIf Not $iPos And Not $fInclude Then
                $sFileList &= $sPath & $sFile & @CRLF
            EndIf
        EndIf
    WEnd
    FileClose($s)
EndFunc   ;==>__FO_FileSearchType

Func __ChExcludeFolders(ByRef $sFile, ByRef $aExcludeFolders)
    For $i = 1 To $aExcludeFolders[0]
        If $sFile = $aExcludeFolders[$i] Then Return True
    Next
    Return False
EndFunc   ;==>__ChExcludeFolders
#EndRegion  ;UDF
[/cut]
[cut="Использование:"]Сохранить в текстовый файл с расширением au3 (в примере ниже jpgtest.au3) в кодировке cp1251/Windows-1251, скрипт полностью самодостаточен.

Писалось и проверялось в первую очередь под AutoIt 3.3.8.1, работает с 3.3.12.0, версии выше не проверялись.

Примеры кнопок:

Код: Выделить всё

TOTALCMD#BAR#DATA
"%COMMANDER_PATH%\AutoIt3.exe" "%COMMANDER_PATH%\Utils\JPEGTest\jpgtest.au3"
%P%N --recurs
%COMMANDER_PATH%\AutoIt3.exe
Проверка JPEG в папке под курсором (рекурсивно)
%COMMANDER_PATH%\Utils\JPEGTest\

-1

Код: Выделить всё

TOTALCMD#BAR#DATA
"%COMMANDER_PATH%\AutoIt3.exe" "%COMMANDER_PATH%\Utils\JPEGTest\jpgtest.au3"
"%WL"
%COMMANDER_PATH%\AutoIt3.exe
Проверка выделенных JPEG
%COMMANDER_PATH%\Utils\JPEGTest\

-1
AutoIt3.exe нужно взять из дистрибутива с офсайта: если версия некритична, то можно взять 3.3.8.1 (размер меньше, работа подтверждена в т.ч. и под Win10).
Если уже используются скомпилированные скрипты AutoIt, то можно попробовать запустить с параметром /AutoIt3ExecuteScript, например:

Код: Выделить всё

"%COMMANDER_PATH%\Utils\TCIMG\TCIMG.exe" /AutoIt3ExecuteScript "%COMMANDER_PATH%\Utils\JPEGTest\jpgtest.au3"
[/cut]
Последний раз редактировалось Skif_off Пн апр 23, 2018 22:43, всего редактировалось 20 раз.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Скрипт AutoIt: убраны лишние константы; уточнения в комментариях.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Скрипт AutoIt:
- параметр запуска "recurs" заменён на "--recurs";
- скрипты нумеруются начиная с 1, на случай запуска нескольких копий (число дописывается в имена временных и лог-файлов, в заголовок окна и заголовки сообщений).

Для понимающих или желающих: попробовал добавить открытие лога не в редакторе по умолчанию для *.txt, а в редакторе из настроек ТС или DC. Для TC допустимые значения ключа Editor - варианты типа
[cut]

Код: Выделить всё

"%COMMANDER_PATH%\Utilities\AkelPad\AkelPad.exe"
"%COMMANDER_PATH%\Utilities\AkelPad\AkelPad.exe" "%1"
"%COMMANDER_PATH%\Utilities\AkelPad\AkelPad.exe" /x
"%COMMANDER_PATH%\Addons\F4Menu\F4Menu.exe" -m "%1"
[/cut]
DC не дописывает "%1". Поддерживаются %COMMANDER_PATH% и %COMMANDER_DRIVE%.
Не уверен на 100%, пока не добавил, идеи приветствуются. Как добавить самостоятельно:
- перед строкой

Код: Выделить всё

#Region ;FileOperations.au3, 1.8.5 (2014.05.26)
вставить функцию
[cut]

Код: Выделить всё

Func __OpenLog($sFile)
    Local $hFile, $COMMANDER_PATH, $COMMANDER_DRIVE, $wincmd, $aEdit, $sEdit
    If EnvGet('COMMANDER_INI') Then
        $COMMANDER_PATH = EnvGet('COMMANDER_PATH')
        $COMMANDER_DRIVE = EnvGet('COMMANDER_DRIVE')
        $wincmd = EnvGet('COMMANDER_INI')
        If StringInStr($wincmd, '\doublecmd.xml') Then
            $hFile = FileOpen($wincmd, 256)
            $sEdit = FileRead($hFile)
            FileClose($hFile)
            $aEdit = StringRegExp($sEdit, '(?is)<Editor Enabled=.*?</Editor>', 3)
            If IsArray($aEdit) Then
                If StringInStr($aEdit[0], 'Enabled="False"') Then
                    ShellExecute($sFile)
                Else
                    If StringInStr($aEdit[0], '<Parameters/>') Then
                        $sEdit = StringRegExpReplace($aEdit[0], '(?is)\s*<Editor Enabled="True">\s+<Path>([^<]*?)</Path>.*', '"\1" "')
                    Else
                        $sEdit = StringRegExpReplace($aEdit[0], '(?is)\s*<Editor Enabled="True">\s+<Path>([^<]*?)</Path>\s+<Parameters>(.*?)</Parameters>.*', '"\1" \2 "')
                    EndIf
                    $sEdit &= $sFile
                    $sEdit &= '"'
                    $sEdit = StringReplace($sEdit, '%COMMANDER_DRIVE%\', $COMMANDER_DRIVE & '\')
                    $sEdit = StringReplace($sEdit, '%COMMANDER_PATH%\', $COMMANDER_PATH & '\')
                    Run($sEdit, '', @SW_SHOW)
                EndIf
            Else
                ShellExecute($sFile)
            EndIf
        Else
            $sEdit = IniRead($wincmd, 'Configuration', 'Editor', '')
            $sEdit = StringReplace($sEdit, '%COMMANDER_DRIVE%\', $COMMANDER_DRIVE & '\')
            $sEdit = StringReplace($sEdit, '%COMMANDER_PATH%\', $COMMANDER_PATH & '\')
            If StringInStr($sEdit, '%1') Then
                $sEdit = StringReplace($sEdit, '"%1"', '"' & $sFile & '"')
                If @extended <> 1 Then $sEdit = StringReplace($sEdit, '%1', '"' & $sFile & '"')
            Else
                $sEdit &= ' "'
                $sEdit &= $sFile
                $sEdit &= '"'
            EndIf
            Run($sEdit, '', @SW_SHOW)
        EndIf
    Else
        ShellExecute($sFile)
    EndIf
EndFunc   ;==>__OpenLog
[/cut]
- заменить в двух местах

Код: Выделить всё

ShellExecute($sTemp & '\jpgerror' & $Num & '.txt')
на

Код: Выделить всё

__OpenLog($sTemp & '\jpgerror' & $Num & '.txt')
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Скрипт AutoIt:
- исправлена ошибка в случае использования списков файлов: туперь пустая строка в конце убирается.
- правка имён переменных.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Скрипт обновлён:

- исправлено получение индекса для окна/лога/временного файла
[cut]Брать на единицу больше общего количества окон запущенных копий скрипта оказалось не очень умным, т.к. все запущенные копии не завершаются одновременно.
Дополнительно добавлена и проверка на существование лога с таким индексом, на случай, если окно уже закрыто, а лог всё ещё открыт пользователем.[/cut]
- теперь статус (индикатор общего количества файлов и файлов с проблемами) не будет сбрасываться сразу после открытия лога, а только после начала нового поиска;
- исправлено время и условие закрытия дескриптора лог-файла (в некоторых случаях могла вылезти ошибка доступа к файлу);
- добавлена возможность указать в поле ввода имена папок для исключения из поиска, формат записи:
ваша папка для поиска|папка для исключения1|папка для исключения2
или
полный путь к файлу-списку|папка для исключения1|папка для исключения2
Имя папки для исключения ищется в любом месте полного имени файла!
В поле ввода кавычки не нужны, а при запуске с параметрами необходимо брать в кавычки всю строку целиком.
- добавлена возможность использовать в поле ввода переменные окружения;
- значительно уменьшен размер скрипта: из главной функции UDF FileOperations.au3 убрано неспользуемое и выпилены ставшие ненужными доп. функции.

Добавлено спустя 23 минуты:

Скрипт обновлён:

- изменено поведение при нажатии клавиши Esc: теперь задание не будет прерываться сразу, а пользователю будет задан вопрос.


Добавлено спустя 20 минут:

Скрипт обновлён:

- исправлено зацикливание при попытке прервать задание нажатием клавиши Esc.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Скрипт обновлён:

- добавлена проверка существования jpegtran.exe.
- мелкие правки.

Если делать копирование проблемных файлов, то сохранять ли все метки дат? Учитывая, что может быть использован файл-список, копирование проще с сохранением полного пути.
Как-то это смущает несколько: файл может быть просто большим или его имя содержит юникод, может, Jpegtran тупо завис - такие файлы попадают в список проблемных.

Добавлено позже:
Пожалуй, проще генерировать батники...
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Скрипт обновлён:

- добавлена возможность сгенерировать два cmd-файла - для копирования и удаления файлов. Кнопка будет доступна только если найдены файлы с проблемами (Смотрите примечание в начале скрипта!). Необходимо будет указать каталог назначения, дерево каталогов будет создано командами mkdir (если не отключали режим расширенной обработки команд);
- изменены имена создаваемых файлов;
- дополнительные проверки/обработка ошибок;
- прочие небольшие правки.

[cut="Имена создаваемых файлов:"]%TEMP%\jpegtestN.jpg: выходной файл Jpegtran, будет удалён автоматически после завершения/прерывания задания;
%TEMP%\jpegtestN.log: файл лога с результатами работы скрипта (только ошибки, в формате "полное имя файласимвол табуляциипричина");

выбранный каталог\jpegtest_copyN.cmd: cmd-файл для копирования файлов;
выбранный каталог\jpegtest_deleteN.cmd: cmd-файл для удаления файлов.[/cut]

Описание в начале скрипта, в комментариях. Смотрите примечание! Это примечание дописывается и в комментарии в создаваемые cmd-файлы.
Ответить