View previous topic :: View next topic |
Author |
Message |
SVM
Joined: 16 Oct 2008 Posts: 47
|
(Separately) Posted: Fri Sep 26, 2014 20:04 Post subject: |
|
|
Skif_off
хоткей я уже добавил.
Skif_off wrote: | А чем плох Alt+Tab? |
Что-то я не нашёл, как с помощью Alt+Tab можно свернуть скрипт в трей.
Я не сварачиваемые окна сварачиваю с помощью Caesar, но такая функция в скрипте не помешала бы. |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Fri Sep 26, 2014 21:05 Post subject: |
|
|
SVM wrote: | Что-то я не нашёл, как с помощью Alt+Tab можно свернуть скрипт в трей. |
Alt+Tab позволяет быстро переключать окна. |
|
Back to top |
|
|
SVM
Joined: 16 Oct 2008 Posts: 47
|
(Separately) Posted: Tue Sep 30, 2014 13:48 Post subject: |
|
|
Skif_off
У меня во время проверки большого колличества jpeg файлов, скрипт иногда зависает. Висит в процессах, нагружая процессор на 50%, в это время JpegTran.exe из процессов изчезает. |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Tue Sep 30, 2014 15:11 Post subject: |
|
|
В качестве слабого компа выступал 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%.
Скрипт: Code: |
#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 |
Для полной самодостаточности в конец скрипта скопировать из FileOperations.au3 функции:
_FO_FileSearch
__FO_GetListMask
__FO_UserLocale
__FO_FileSearchType
__FO_FileSearchMask
__FO_FileSearchAll
__ChExcludeFolders
__FO_MaskUnique (перед функцией добавить директиву #Obfuscator_Off на случай компиляции)
З.Ы. На нормальном, достаточно современном десктопе с не самыми медленными хардами и более чем одним ядром (антивируснику же надо нагнуть систему), можно попробовать поставить Opt('WinWaitDelay', 50): выигрыш от 2% и далее на разнородных файлах (ну и на большом количестве).
Last edited by Skif_off on Tue Oct 07, 2014 10:32; edited 2 times in total |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Wed Oct 01, 2014 13:04 Post subject: |
|
|
Если кому-нибудь интересно: проверил работу с over MAX_PATH - нормально
с небольшим изменением скрипта Code: | ;нужно заменить
$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) |
(предполагается, что скрипт, 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 символами, чтобы подсократить,
можно Code: |
;заменить
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 |
Как скажется на скорости - не проверял. |
|
Back to top |
|
|
SVM
Joined: 16 Oct 2008 Posts: 47
|
(Separately) Posted: Mon Oct 06, 2014 14:49 Post subject: |
|
|
Skif_off
Хорошо если было бы возможно переместить найденные недокаченные фотографии с сохранением структуры папок, через gui или например, как в CloneSpy создавался bat файл. |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Mon Oct 06, 2014 23:41 Post subject: |
|
|
SVM
В jpgerror.txt между именем файла и текстом ошибки вставляется табуляция, как раз на случай использования в качестве разделителя в любом табличном процессоре (LibreOffice Calc/Microsoft Excel/PlanMaker (SoftMaker Office)/Spread32), но это, конечно, если только вручную.
Надо подумать, но перемещение - это запись на носитель, если только опцию с копированием.
И не все будут недокачанными - что-то не получится открыть из-за размера или длинного пути, как минимум: не искал все сообщения jpegtran, только то, что можно смоделировать переименованием и HEX-редактором (пока тестировал). |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Tue Oct 07, 2014 05:16 Post subject: |
|
|
Усложнён обработчик ошибок для диалога выбора каталога, теперь сразу вылезет сообщение об ошибке и будет предложено повторить, если пользователь вдруг промахнётся и выберет "Компьютер", "Панель управления" или что-то в этом духе. |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Sun Sep 06, 2015 19:43 Post subject: |
|
|
Скрипт 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! В этом случае будет показан результат на текущий момент.
Остальное, включая список поддерживаемых параметров запуска см. в комментариях в начале скрипта. Смотрите примечание!
Скрипт Code: | ;Автор идеи 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
|
Использование: Сохранить в текстовый файл с расширением au3 (в примере ниже jpgtest.au3) в кодировке cp1251/Windows-1251, скрипт полностью самодостаточен.
Писалось и проверялось в первую очередь под AutoIt 3.3.8.1, работает с 3.3.12.0, версии выше не проверялись.
Примеры кнопок:
Code: | 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 |
Code: | 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, например:
Code: | "%COMMANDER_PATH%\Utils\TCIMG\TCIMG.exe" /AutoIt3ExecuteScript "%COMMANDER_PATH%\Utils\JPEGTest\jpgtest.au3" |
Last edited by Skif_off on Mon Apr 23, 2018 23:43; edited 20 times in total |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Wed Sep 23, 2015 14:53 Post subject: |
|
|
Скрипт AutoIt: убраны лишние константы; уточнения в комментариях. |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Fri Oct 23, 2015 16:40 Post subject: |
|
|
Скрипт AutoIt:
- параметр запуска "recurs" заменён на "--recurs";
- скрипты нумеруются начиная с 1, на случай запуска нескольких копий (число дописывается в имена временных и лог-файлов, в заголовок окна и заголовки сообщений).
Для понимающих или желающих: попробовал добавить открытие лога не в редакторе по умолчанию для *.txt, а в редакторе из настроек ТС или DC. Для TC допустимые значения ключа Editor - варианты типа
Hidden text Code: | "%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" |
DC не дописывает "%1". Поддерживаются %COMMANDER_PATH% и %COMMANDER_DRIVE%.
Не уверен на 100%, пока не добавил, идеи приветствуются. Как добавить самостоятельно:
- перед строкой
Code: | #Region ;FileOperations.au3, 1.8.5 (2014.05.26) |
вставить функцию
Hidden text Code: | 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
|
- заменить в двух местах
Code: | ShellExecute($sTemp & '\jpgerror' & $Num & '.txt') |
на
Code: | __OpenLog($sTemp & '\jpgerror' & $Num & '.txt') |
|
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Tue Oct 27, 2015 06:08 Post subject: |
|
|
Скрипт AutoIt:
- исправлена ошибка в случае использования списков файлов: туперь пустая строка в конце убирается.
- правка имён переменных. |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Tue Dec 13, 2016 03:45 Post subject: |
|
|
Скрипт обновлён:
- исправлено получение индекса для окна/лога/временного файла
Hidden text Брать на единицу больше общего количества окон запущенных копий скрипта оказалось не очень умным, т.к. все запущенные копии не завершаются одновременно.
Дополнительно добавлена и проверка на существование лога с таким индексом, на случай, если окно уже закрыто, а лог всё ещё открыт пользователем.
- теперь статус (индикатор общего количества файлов и файлов с проблемами) не будет сбрасываться сразу после открытия лога, а только после начала нового поиска;
- исправлено время и условие закрытия дескриптора лог-файла (в некоторых случаях могла вылезти ошибка доступа к файлу);
- добавлена возможность указать в поле ввода имена папок для исключения из поиска, формат записи:
Quote: | ваша папка для поиска|папка для исключения1|папка для исключения2 |
или
Quote: | полный путь к файлу-списку|папка для исключения1|папка для исключения2 |
Имя папки для исключения ищется в любом месте полного имени файла!
В поле ввода кавычки не нужны, а при запуске с параметрами необходимо брать в кавычки всю строку целиком.
- добавлена возможность использовать в поле ввода переменные окружения;
- значительно уменьшен размер скрипта: из главной функции UDF FileOperations.au3 убрано неспользуемое и выпилены ставшие ненужными доп. функции.
Добавлено спустя 23 минуты:
Скрипт обновлён:
- изменено поведение при нажатии клавиши Esc: теперь задание не будет прерываться сразу, а пользователю будет задан вопрос.
Добавлено спустя 20 минут:
Скрипт обновлён:
- исправлено зацикливание при попытке прервать задание нажатием клавиши Esc. |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Thu Dec 15, 2016 22:04 Post subject: |
|
|
Скрипт обновлён:
- добавлена проверка существования jpegtran.exe.
- мелкие правки.
Если делать копирование проблемных файлов, то сохранять ли все метки дат? Учитывая, что может быть использован файл-список, копирование проще с сохранением полного пути.
Как-то это смущает несколько: файл может быть просто большим или его имя содержит юникод, может, Jpegtran тупо завис - такие файлы попадают в список проблемных.
Добавлено позже:
Пожалуй, проще генерировать батники... |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Fri Dec 16, 2016 18:53 Post subject: |
|
|
Скрипт обновлён:
- добавлена возможность сгенерировать два cmd-файла - для копирования и удаления файлов. Кнопка будет доступна только если найдены файлы с проблемами (Смотрите примечание в начале скрипта!). Необходимо будет указать каталог назначения, дерево каталогов будет создано командами mkdir (если не отключали режим расширенной обработки команд);
- изменены имена создаваемых файлов;
- дополнительные проверки/обработка ошибок;
- прочие небольшие правки.
Имена создаваемых файлов: %TEMP%\jpegtestN.jpg: выходной файл Jpegtran, будет удалён автоматически после завершения/прерывания задания;
%TEMP%\jpegtestN.log: файл лога с результатами работы скрипта (только ошибки, в формате "полное имя файласимвол табуляциипричина");
выбранный каталог\jpegtest_copyN.cmd: cmd-файл для копирования файлов;
выбранный каталог\jpegtest_deleteN.cmd: cmd-файл для удаления файлов.
Описание в начале скрипта, в комментариях. Смотрите примечание! Это примечание дописывается и в комментарии в создаваемые cmd-файлы. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|