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

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

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

Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Skif_off писал(а):а путь к файлам как передать?
не предусмотрено.
обрабатывается текущая папка (и глубже, если указан /S)
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Положил в нужную папку и запустил батник без всяких кнопок - всё нормально отработало. Значит, работало без кнопки :)
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

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

TOTALCMD#BAR#DATA
%commander_path%\Toolz\jpgtest.cmd
/s
shell32.dll,117
Тест JPEG-файлов в этой папке


-1

заходишь в нужную папку, нажимаешь кнопку
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Tol!k писал(а):надёжнее – в папку, прописанную в %path%
Надёжно, но непортабельно. :wink:
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Tol!k
Нифига, сыпется в лог

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

Not a JPEG file:
Corrupt JPEG data:
Premature end of
Empty input file
Invalid JPEG file structure:
JPEG datastream contains no image
и всё. Файл %tmp%\jpgtest.tmp не удаляется скриптом.
jpgerror.lst должен создаваться рядом с jpegtran.exe?
Tol!k писал(а):надёжнее – в папку, прописанную в %path%
Попробовал ради любопытства добавить

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

set PATH=%PATH%;%COMMANDER_PATH%\UTILITIES\JPEGTest\
jpgerror.lst создается в корневой папке с картинками, что не есть гуд: писать там, где проверяешь - дурной тон.

З.Ы. Наверное, запилю на AutoIt :)
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Набросал, в общем, [cut="как-то так"]

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

#NoTrayIcon

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

#Region ;Обрабатываем командную строку, если пустая - появится окно выбора каталога
If $CmdLine[0] = 0 Then
    $sPathWithPic = FileSelectFolder('Укажите каталог с изображениями', '' , 4)
    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[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, 'Ошибка', 'Невозможно открыть файл.')
    Exit
EndIf
;Счетчик ошибок
$CounterError = '0'

;GUICreate("JPGtest.au3", 250, 100)
;$iStatusBar = GUICtrlCreateLabel('', 5, 10, 240, 90, 0x0000)
;GUICtrlSetColor(-1, 0xff0000)
;GUISetState()

For $i = 1 To $aFileList[0]
;    GUICtrlSetData($iStatusBar, $aFileList[$i])
    $sOut = ''
    $iPID = Run(@ScriptDir & '\jpegtran.exe -optimize "' & $aFileList[$i] & '" "' & @TempDir & '\testtmp.jpg"', '', @SW_HIDE, 4)
    While 1
        $sOut &= StderrRead($iPID)
        If @error Then ExitLoop
    WEnd
    If $sOut Then
        $sError = StringRegExpReplace($sOut, "[\r\n]+", " ")
        FileWriteLine($hFile, $aFileList[$i] & @TAB & $sError)
        $CounterError += 1
    EndIf
Next

FileClose($hFile)
;GUIDelete()
#EndRegion

;Дополнение для результата
If $iD = 0 Then
    $recurs = ' (исключая подкаталоги) '
ElseIf $iD = 125 Then
    $recurs = ' (включая подкаталоги) '
EndIf
;Результат
If $CounterError = '' Then
    MsgBox(4096, 'JPGtest.au3', 'Скрипт завершил работу, поврежденные файлы в ' & _
        'каталоге "' & $sPathWithPic & '"' & $recurs & 'не найдены.')
Else
    Switch MsgBox(4 + 4096, 'JPGtest.au3', 'Скрипт завершил работу, в каталоге "' & _
        $sPathWithPic & '"' & $recurs & 'найдены поврежденные файлы: ' & $CounterError & '. Открыть список?')
        Case 6
            ShellExecute(@TempDir & '\jpgerror.txt')
        Case 7
            Exit
    EndSwitch
EndIf
[/cut]
Из комментов вроде все понятно. Ключи: jpgtest.au3 %P%N - запуск в каталоге, jpgtest.au3 %P%N recurs - включая подкаталоги. Если раскомментировать строки 63-66, 69, 84, то при работе появится небольшое окно в котором будет имя и путь текущего файла.
Наверное, можно заменить _FO_FileSearch() на dir - подсократить скрипт.

Добавлено:
Какая-то фигня: на тестовом наборе из сохраненных из интернета пикч (фактически - неоднократно пережатые) рандомно зависает на некоторых файлах, если в Process Hacker скопировать зависшую командную строку и запустить в консоли - всё нормально.
Батник (скопировал в корневой каталог) отрабатывает номалньно.
Последний раз редактировалось Skif_off Пт сен 26, 2014 12:19, всего редактировалось 1 раз.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

По скрипту: проверил в WinPE (на базе XP SP2/XP SP3/7 и 8.1 x86|x64), версии AutoIt 3.3.8.1 и 3.3.12.0 - отлично отрабатывает. На нормальной WinXP SP3 - тоже, а вот на Win7x64 - нет.
Непонятно.

Добавлено:
Это нечто: в виртуалке чистая Win7x64+все обновления - работает.
SVM
Сообщения: 47
Зарегистрирован: Чт окт 16, 2008 16:36

Сообщение SVM »

Skif_off
Спасибо за скрипт!
Skif_off писал(а):Ключи: jpgtest.au3 "%P" - запуск в каталоге, jpgtest.au3 "%P" recurs - включая подкаталоги.
Если в параметры кнопки прописать %P recurs или %P и выделить папку с jpeg, то у меня открывается окно с обзором папок.
Skif_off писал(а):Если раскомментировать строки 63-66, 69, 84, то при работе появится небольшое окно в котором будет имя и путь текущего файла.
Если путь длинный, то виден только путь, а не файлы. Хорошо бы если строка переносилась по словам или показывался прогрес в процентах.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

SVM писал(а):Если в параметры кнопки прописать %P recurs или %P
Ну, это, конечно, мой недосмотр: %P%N и %P%N recurs для папки под курсором - пока отлаживаю, запускаю без параметров, надо ещё подумать - мне нравится, как запускается батник Tol!k в текущем каталоге.

О прогрессе не может быть речи :) Причин две, выберите какая нравится: у меня плохо получается и не хочется усложнять скрипт (всё это занимает время, скрипт должен быть максимально быстрым). По второй же причине не стал резать путь для наглядности. Вообще, GUI добавил сначала для отладки, окончательно не решил, как с ним быть, была мысль добавить значок в трей для наглядности (jpegtran.exe работает шустро, конечно, но совсем без индикации работы нехорошо как-то).

Увеличил размер окна и добавил вывод в виде *error/current/all (количество ошибок/номер текущего файла/всего файлов).
[cut]

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

#NoTrayIcon

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

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

#Region ;Обрабатываем командную строку, если пустая - появится окно выбора каталога
If $CmdLine[0] = 0 Then
    $sPathWithPic = FileSelectFolder('Укажите каталог с изображениями', '' , 4)
    If @error = 1 Then Exit
    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, 'Ошибка', 'Невозможно открыть файл.')
    Exit
EndIf
;Счетчик ошибок
$CounterError = '0' 
;GUI
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: *' & $CounterError & '/' & $i & '/' & $aFileList[0])
    $sOut = ''
    $iPID = Run(@ScriptDir & '\jpegtran.exe -optimize "' & $aFileList[$i] & '" "' & @TempDir & '\testtmp.jpg"', '', @SW_HIDE, 4)
    While 1
        $sOut &= StderrRead($iPID)
        If @error Then ExitLoop
    WEnd
    If $sOut Then
        $sError = StringRegExpReplace($sOut, "[\r\n]+", " ")
        FileWriteLine($hFile, $aFileList[$i] & @TAB & $sError)
        $CounterError += 1
    EndIf
Next

FileClose($hFile)
GUIDelete()
#EndRegion

;Дополнение для результата
If $iD = 0 Then
    $recurs = ' (исключая подкаталоги) '
ElseIf $iD = 125 Then
    $recurs = ' (включая подкаталоги) '
EndIf
;Результат
If $CounterError = '0' Then
    MsgBox(4096, 'JPGtest.au3', 'Скрипт завершил работу, поврежденные файлы в ' & _
        'каталоге "' & $sPathWithPic & '"' & $recurs & 'не найдены.')
Else
    Switch MsgBox(4 + 4096, 'JPGtest.au3', 'Скрипт завершил работу, в каталоге "' & _
        $sPathWithPic & '"' & $recurs & 'найдены поврежденные файлы: ' & $CounterError & '. Открыть список?')
        Case 6
            ShellExecute(@TempDir & '\jpgerror.txt')
        Case 7
            Exit
    EndSwitch
EndIf
[/cut]
Не знаю, что будет в итоге - скрипт работает нормально везде, кроме моей системы :) Отвлекся немного с MAFF, чуть позже буду пробовать ещё.
Последний раз редактировалось Skif_off Пт сен 26, 2014 14:41, всего редактировалось 2 раза.
SVM
Сообщения: 47
Зарегистрирован: Чт окт 16, 2008 16:36

Сообщение SVM »

Skif_off писал(а):%P%N и %P%N recurs для папки под курсором - пока отлаживаю
То есть, это возможность пока не реализованна?
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

SVM
Реализована, просто второпях дописывал пост и ошибся, потом забыл исправить. Исправил.
Была мысль посмотреть что консольное для TIFF/PSD/RAW, но они менее распространены (продвинутое/профессиональное фото/полиграфия в основном) и несжатые: наверное, как с DVD - несколько секторов, забитых нулями/кашей, не проблема, тогда оптимизация алгоритмом Хаффмана не вариант.
SVM
Сообщения: 47
Зарегистрирован: Чт окт 16, 2008 16:36

Сообщение SVM »

Skif_off
У меня если в параметрах кнопки прописать %P%N или %P%N recurs, всё равно открывается окно обзор папок.

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

TOTALCMD#BAR#DATA
"c:\Program Files\JpegTran\jpgtest.au3"
%P%N recurs
C:\Program Files\AutoIt3\AutoIt3.exe,3
jpgtest
c:\Program Files\JpegTran\

-1
Total Commander 8.0, WindowsXP sp2, AutoIt 3.3.8.1
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

SVM
Попробуйте запуск в виде AutoIt3.exe file. У меня так работает

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

TOTALCMD#BAR#DATA
"%COMMANDER_PATH%\AutoIt3.exe" "%COMMANDER_PATH%\UTILITIES\JPEGTest\jpgtest.au3"
%P%N recurs
%COMMANDER_PATH%\AutoIt3.exe
jpgtest
%COMMANDER_PATH%\UTILITIES\JPEGTest\

-1
Собственно, у меня и в вашем варианте запускается правильно.

Скрипт чуть изменен, упустил вариант: если нажать Отмена в окне обзора папок, то скрипт всё равно пытается продолжить работу, хотя путь будет пустым и в конечном итоге вылезет ошибка Неверный путь!.
SVM
Сообщения: 47
Зарегистрирован: Чт окт 16, 2008 16:36

Сообщение SVM »

Skif_off
Так работает! Хорошо бы ещё, если было можно сворачивать в трей по кнопке свернуть.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

SVM
Честно говоря, не хочется раздувать скрипт: нужно прикручивать цикл While...WEnd, опрашивать GUI, кнопку закрытия ещё, потом кто-нибудь попросит добавить хоткей (да и без просьбы, напрашивается)...
В общем - не обещаю. А чем плох Alt+Tab?
Ответить