| View previous topic :: View next topic |
| Author |
Message |
AkulaBig
Joined: 03 Dec 2008 Posts: 567
|
(Separately) Posted: Sat May 16, 2026 17:19 Post subject: |
|
|
| Orion9 wrote: | | Скрытый текст |
Я выше написал, что проверил vbs. Не работает даже сам скрипт. Код какой-то неправильный.
| Orion9 wrote: | | Для нормальной работы нужен отдельный wdx |
Есть отдельный wdx, который работает в 10 раз медленней моего скрипта. Из-за временных интервалов, которые обязательно требуются при -stay_open. |
|
| Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 1127
|
(Separately) Posted: Sat May 16, 2026 18:19 Post subject: |
|
|
| AkulaBig wrote: | | Не работает даже сам скрипт. Код какой-то неправильный. |
Мой скрипт работает, иначе зачем бы мне его выкладывать? И работает он быстро, но с косяками, которые были озвучены там же.
Хотел уже снести это дело, но потом подумал, почему бы не проверить через cscript.exe, заодно и скорость посмотреть. Снял комментарии в options.ini
| Code: | vbs=%WINDIR%\system32\cscript.exe
vbsCmdArgs=//nologo
vbsVarFormat=filename="%s"
vbsDoubleSlashPath=0
vbsStdOutFormat=Wscript.echo %s
|
Ну что сказать. Работает. Теперь и удаление и sleep работают, но скорость значительно упала. Плюс появились кракозябры, но это, наверное, можно решить. Полный скрипт
 Hidden text | Code: | 'Option Explicit
Dim fso, argFile, outFile
Set fso = CreateObject("Scripting.FileSystemObject")
argFile = fso.GetSpecialFolder(2) & "\exiftool_args.txt"
outFile = fso.GetSpecialFolder(2) & "\exiftool_out.txt"
'content = GetExifTag(filename, "ImageSize")
content = GetExifTag(filename, "FileName")
Function GetExifTag(fileName, tagName)
Dim stream, result
If fso.FileExists(outFile) Then fso.DeleteFile(outFile)
Set stream = fso.OpenTextFile(argFile, 8) ' 8 = Append
stream.WriteLine "-s3"
'stream.WriteLine "-" & tagName
stream.WriteLine "-W+!"
stream.WriteLine outFile
stream.WriteLine fileName
stream.WriteLine "-execute"
stream.Close
Dim timeout
timeout = 0
Do While Not fso.FileExists(outFile) And timeout < 50
WScript.Sleep(10)
timeout = timeout + 1
Loop
If fso.FileExists(outFile) Then
Set stream = fso.OpenTextFile(outFile, 1)
If Not stream.AtEndOfStream Then
result = Trim(stream.ReadAll)
Else
result = "Empty"
End If
stream.Close
GetExifTag = result
Else
GetExifTag = "Error: Timeout"
End If
End Function |
Можно, конечно, и дальше ловить рыбку в этой мутной воде, но, похоже, улов будет не тот, депрессивный. В общем, я пас. |
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 567
|
(Separately) Posted: Sat May 16, 2026 23:44 Post subject: |
|
|
| Orion9 wrote: | | Мой скрипт работает |
Пришлось покопаться, но завел ваш скрипт. На vbs он не работает:
А вот на cscript.exe действительно работает. Только убрал коммент с stream.WriteLine "-" & tagName
В общем ваш скрипт, видимо, написан под старый движок vbs. А у меня Винда 11 с последними обновлениями.
Перевод крякозябров я делал:
| Code: |
With CreateObject("ADODB.Stream")
.Charset = "Windows-1251"
.Open
.WriteText objWshExec.StdOut.ReadAll
.Position = 0
.Charset = "UTF-8"
content = .ReadText
End With |
Но с налета привязать к вашему скрипту не получилось.
А теперь очень неприятное. Посмотрите, как отвратительно работает ваш вариант и как отлично мой. При этом вашим скриптом я вывожу только одно поле и без перекодировки. А мой скрипт выводит 35 полей и перекодирует текст. Так что искусственное задание временного интервала, это полное днище:
ваш
мой
 |
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 567
|
(Separately) Posted: Sun May 17, 2026 10:43 Post subject: |
|
|
Orion9
Ну наконец-то и у меня получилось на au3. Пока сделал для одного поля. Работает быстро. Теперь надо решить вопрос с запуском/закрытием ET. Если с Ауторан запускать, закрывается сам при выходе из ТС. Но все время висит в памяти. Если запускать из скрипта, не закрывается при выходе из ТС. Если закрывать в скрипте, работает медленнее. Ну это понятно. На каждом файле запускается/закрывается.
 Hidden text
| Code: |
#NoTrayIcon
If StringInStr(FileGetAttrib($filename), "D") Then Exit
Local $sExifPath = EnvGet("util_ET") ; Путь к exiftool
Global $sArgFile = @TempDir & "\exiftool_args.txt"
Global $sOutFile = @TempDir & "\exiftool_out.txt"
; Подготовка файла аргументов
FileDelete($sArgFile)
FileWrite($sArgFile, "")
; Запуск процесса ExifTool (один раз)
If Not ProcessExists("exiftool.exe") Then
; Используем $STDIN_CHILD + $STDOUT_CHILD для взаимодействия
Global $iPID = Run($sExifPath & ' -stay_open True -@ "' & $sArgFile & '"', "", @SW_HIDE, 0x3)
EndIf
$content = GetTag($filename, "Title")
; MsgBox(64, "Результат", $content)
; Закрываем ExifTool
; Quit()
ConsoleWrite($content)
; --- Функция получения данных ---
Func GetTag($sFile, $sTag)
If FileExists($sOutFile) Then FileDelete($sOutFile)
; Формируем команду
; -s3: только значение, -S: краткий формат, -echo4: выводит маркер в StdOut после завершения
Local $sCmd = "-s3" & @LF & "-" & $sTag & @LF & "-W+!" & @LF & $sOutFile & @LF & $sFile & @LF & "-execute" & @LF
; Записываем команду в файл аргументов
Local $hFile = FileOpen($sArgFile, 1) ; 1 = Write mode (append)
FileWrite($hFile, $sCmd)
FileClose($hFile)
Local $hFile
Local $sOut = ""
While 1
$hFile = FileOpen($sOutFile)
If $hFile <> -1 Then
$sOut = FileRead($hFile)
FileClose($hFile)
FileDelete($sOutFile)
ExitLoop
EndIf
WEnd
Return $sOut
EndFunc
; --- Функция закрытия ---
Func Quit()
Local $hFile = FileOpen($sArgFile, 1)
FileWrite($hFile, "-stay_open" & @LF & "False" & @LF)
FileClose($hFile)
ProcessWaitClose("exiftool.exe")
FileDelete($sArgFile)
EndFunc
|
Обратите внимание, надо полностью убрать задержку. Тогда все хорошо работает, а не читаемые данные обрабатываются правильно. Так что ничего не виснет.
Сейчас в первую очередь приделаю все поля и перекодировку. А потом начну до ума доводить.
Вот-бы разобраться с -@ -. Там вообще временные файлы не используются что ли. Не понятно, куда тогда аргументы пишутся.
Ну и в преспективе разобраться-бы с потоками для au3. |
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 567
|
|
| Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 1127
|
(Separately) Posted: Wed May 20, 2026 23:10 Post subject: |
|
|
AkulaBig
Бросайте вы это дело, к чему такая куча костылей? Вы серьезно собрались 30 полей что ли выводить Ну come on же... Всё, что требует горизонтального проручивания неюзабельно, будь то браузер, текстовый редактор или панель ТС.
Даже если вы оставите неколько полей, которые будут помещаться на экран, всё-равно овчинка выделки не стоит. Что такого уникального может предложить exifool, чтобы так загоняться?
| AkulaBig wrote: | | Может у вас есть идеи как перехватить обработку ошибки? |
Речь идет о плагине, или о скрипте? А то я что-то запутался. Если дергание каждого поля приводит к такому результату (а оно судя по всему приводит, я же не зря закомметировал вывод одиночного поля), то единственным выходом остается получать весь выхлоп от утилиты и разбирать его на отдельные поля. |
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 567
|
(Separately) Posted: Thu May 21, 2026 07:04 Post subject: |
|
|
| Orion9 wrote: | | 30 полей что ли выводить |
Нет, конечно. Вывожу 34 поля
| Orion9 wrote: | | Всё, что требует горизонтального проручивания неюзабельно |
Почему? Размеры экранов девайсов на всех гаджетах разные.
| Orion9 wrote: | | Что такого уникального может предложить exifool, чтобы так загоняться? |
Например, сейчас я заменил 4 плагина для показа документов на один. И для других расширений заменю.
| Orion9 wrote: | | Речь идет о плагине, или о скрипте? |
Сравниваю плагин китайца с моим скриптом.
| Orion9 wrote: | | Если дергание каждого поля приводит к такому результату (а оно судя по всему приводит, я же не зря закомметировал вывод одиночного поля) |
Действительно запутались. Плагин ExifToolWDX от китайца как-то обрабатывает ошибку сам и выдает свое сообщение. При этом поля, которые он может прочитать, он показывает. Дергает, это просто выражение. На экране ничего не дергается. Я имею ввиду каждое поле перебирается по очереди. В ET есть временной интервал, за который ET старается прочитать файл. Где-то около 1 сек. И вот если я в скрипте устанавливаю временной интервал 2 с, то через 1 с выдается ошибка от ET. А мой код не обрабатывается. Но в плагине как-то эта ошибка перехватывается. Самое обидное, что файл с данными при этом создается. Посмотрите, ET почему-то выдает ошибку о времени, но после этого создается файл с правильными данными.
А у китайца сообщение не как у меня. Текст свой на английском. И данные выводятся. То-есть он как-то перехватывает ошибку ET^
А вот как работает плагин:
Эта строка появляется через пару минут. То-есть, насколько я понимаю, плагин обрабатывает каждое поле и только после этого выводит данные. Таким образом задержка ET около двух секунд умноженная на 34 поля, дает около 2 мин.
Добавлено спустя 2 часа 13 минут:
Кажется становится понятным возникновение ошибки. Ошибка плагина со скрина Warning [minor], это ошибка самого ET. Она считается незначительной, поэтому плагин продолжает работать. А вот ошибка с гифки на русском языке непонятно чья.
Last edited by AkulaBig on Thu May 21, 2026 10:35; edited 1 time in total |
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 567
|
(Separately) Posted: Thu May 21, 2026 10:34 Post subject: |
|
|
Orion9
Еще вопрос. Решил проверить ваш скрипт:
 Hidden text
| Code: |
#Requires AutoHotkey v2.0
; 1. Конфигурация путей
exiftoolPath := "c:\PortablePrograms\FileManagers\TotalCommanderPortable\Plugins\wlx\ExifToolView\exiftool.exe"
; 2. Формируем список аргументов (строго по одному на строку)
; Опция -S делает вывод компактным (Тег: Значение)
argsContent :=
(
"-f"
"-s3"
"-Title"
)
; Добавляем путь к файлу в конец списка команд
argsContent := "`n" filename
; 3. Запускаем процесс ExifTool с флагами чтения из stdin (-@ -)
shell := ComObject("Wscript.Shell")
exec := shell.Exec('"' exiftoolPath '" -@ -')
; 4. Отправляем команды в поток stdin программы
exec.StdIn.WriteLine(argsContent)
exec.StdIn.Close() ; Закрываем поток, чтобы ExifTool понял, что передача команд окончена, и начал выполнение
; 5. Считываем результат работы (stdout) из ExifTool в переменную
content := exec.StdOut.ReadAll()
; 6. Показываем результат
; MsgBox(output, "Результат ExifTool")
|
Выдает ошибку:
Можете подсказать, что неправильно?
Добавлено спустя 1 час 33 минуты:
Orion9
Ну вот и все. Решил проблему ошибки. Подумал, а что может выдавать ошибку на русском языке? Скорей всего оська. А значит надо смотреть исходники WinScriptsAdv. И точно, в плагине забит код, что если операция не выполняется 2 сек, процесс плагина закрывается. Стоило установить задержку побольше и все заработало. Теперь надо решить, как поизящней переделать этот код. |
|
| Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 1127
|
(Separately) Posted: Thu May 21, 2026 12:12 Post subject: |
|
|
| AkulaBig wrote: | | Нет, конечно. Вывожу 34 поля |
Ну и как, удобно по ним перемещаться?
| AkulaBig wrote: | | Почему? Размеры экранов девайсов на всех гаджетах разные. |
Имеенно об этом и речь. Хотя не только об этом.
| AkulaBig wrote: | | Например, сейчас я заменил 4 плагина для показа документов на один. И для других расширений заменю. |
Зачем? У меня больше 50 wdx установлено, жить они мне не мешают.
| AkulaBig wrote: | | Самое обидное, что файл с данными при этом создается. Посмотрите, ET почему-то выдает ошибку о времени, но после этого создается файл с правильными данными. |
У меня сейчас много других дел, т.ч. в ближайшее время точно посмотреть не смогу, да и большого желания нет, если честно, разбираться, что там делал китаец 10 лет назад.
| AkulaBig wrote: | | А у китайца сообщение не как у меня. |
Прежде, чем делать плагин, автор (китаец) наверняка изучил всю документацию exiftool, а вы, если я правильно понимаю, хотите заменить целых 4 плагина (или даже больше), но изучать документацию при всем при этом не желаете
Ну никто, кроме вас, заниматься реверс инженегрингом все-равно не будет )
Но есть и хорошая новость. Китайцу 10 лет назад было сложнее. Тогда ИИ не было. Сейчас из болвана можно хоть целые плагины выбивать.
| AkulaBig wrote: | | Я имею ввиду каждое поле перебирается по очереди. |
Я это понял. Не знаю, как там сделано в плагине, но если вернуться к vbs, то: когда нет нужного тега, exiftool не создает файл с выводом, отсюда и таймаут на вашем первом скрине. Когда нужные теги есть и нет таймаута, работает быстро. Именно поэтому я закомментировал строку stream.WriteLine "-" & tagName в скрипте — чтобы был полный выхлоп, который можно затем построчно разобрать.
Возможно, в exiftool все предусмотрено и все решается, но это нужно изучать ее доки, причем досконально.
| AkulaBig wrote: | | Можете подсказать, что неправильно? |
Возможно, в файл .ahk нужно добавить FileEncoding 65001 и в конфиге плагина включить опцию CheckUTF8Result=1, которую делал Progman13 |
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 567
|
(Separately) Posted: Thu May 21, 2026 15:17 Post subject: |
|
|
| Orion9 wrote: | | Ну и как, удобно по ним перемещаться? |
Хм, удивлен. Вообще никаких проблем ползунок туда-сюда гонять.
| Orion9 wrote: | | У меня больше 50 wdx установлено, жить они мне не мешают. |
Жить не мешают, но инфы выдают меньше, чем одна ET.
| Orion9 wrote: | | в ближайшее время точно посмотреть не смогу |
Я про гифку
| Orion9 wrote: | | Но есть и хорошая новость. |
Есть. Все получилось
| Orion9 wrote: | | в файл .ahk |
А как знак присвоения значения с этим связан? Ладно, разобраться с опцией -@ - следующий этап. Пока я очень доволен полученным результатом. Хорошо, что автор WinScriptsAdv выложил исходники. Изящно решить проблему не удалось. Сильно ковыряться нужно. Поставил тайм-аут вместо 2000 20000 и на этом закончу. Мой тестовый файл отрабатывает. Думаю на этом можно остановиться. Смотрите, как теперь классенько, по сравнению со скрином выше:
 |
|
| Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 1127
|
(Separately) Posted: Thu May 21, 2026 17:27 Post subject: |
|
|
| AkulaBig wrote: | | Вообще никаких проблем ползунок туда-сюда гонять. |
Оно и видно по этим двум скринам
Скрин 1
Скрин 2
Ладно, это шутка была, как и многое другое ранее ) Но мы сильно отклонились от темы. От Autorun, как я понимаю, вы уже все что нужно взяли — завершение процесса по таймеру (хорошая идея, кстати). WinScriptAdv это все-таки отдельная тема. Или переходите сюда со временем, если захотите.
| AkulaBig wrote: | | Я про гифку |
Лоханулся, признаю. |
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 567
|
(Separately) Posted: Thu May 21, 2026 18:06 Post subject: |
|
|
| Orion9 wrote: | | Оно и видно по этим двум скринам |
Извините, в следущий раз обязательно выложу 3 листа очень необходимой инфы, без которой эти скрины непонятны
| Orion9 wrote: | | От Autorun, как я понимаю, вы уже все что нужно взяли — завершение процесса по таймеру |
Кстати, вот код:
| Code: |
# QuitExifTool.aucfg
# ================================ Описание ================================
# Закрывает программу ExifTool, если нет активных пользовальских колонок.
# ================================ Аргументы ===============================
# Отсутствуют.
# ========================== Возвращаемое значение =========================
# Отсутствует.
# ================================= Примеры ================================
# Включает QuitExifTool.aucfg в файл autorun.cfg.
# Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\QuitExifTool.aucfg
# ==============================================================================
# =============================== Description ==============================
# Closes ExifTool program if there are no active user columns.
# ================================ Arguments ===============================
# No arguments.
# ============================= Returned value =============================
# No return value.
# ================================= Examples ===============================
# Includes QuitExifTool.aucfg in autorun.cfg file.
# Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\QuitExifTool.aucfg
# ==============================================================================
Func ThreadWatchQuitExifTool
# Получить текущий режим просмотра
# Если он меньше 6, то это не пользовательский режим, завершаем процесс ExifTool
# Get current view mode
# ЕIf it is less than 6, then this is not user mode, terminate ExifTool process
If SendMessage(AUTORUN_TCHANDLE, 1074, 1015) < 6 And SendMessage(AUTORUN_TCHANDLE, 1074, 1016) < 6 Then
If ProcessExist("exiftool.exe") Then
ProcessTerminate("~/A /W", "exiftool.exe")
DllCall("kernel32.dll\DeleteFileW", "Wstr", TEMP & "\ET_DOCS_args.txt")
DllCall("kernel32.dll\DeleteFileW", "Wstr", TEMP & "\ET_DOCS_out.txt")
EndIf
EndIf
EndFunc
|
Использован новый функционал ТС11.57. |
|
| Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 1127
|
(Separately) Posted: Thu May 21, 2026 19:07 Post subject: |
|
|
| AkulaBig wrote: | | в следущий раз обязательно выложу |
Не стоит Предыдущие скрины хорошо демонстрируют желание обычного пользователя уместить все на одном экране, что нормально. Это естественный ход вещей, от которого никуда не деться.
| AkulaBig wrote: | | Использован новый функционал ТС11.57. |
Первые плоды услилий Flasher? Приятно видеть.
Функция вызывается в отдельном потоке? С каким интервалом? |
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 567
|
(Separately) Posted: Thu May 21, 2026 20:33 Post subject: |
|
|
| Orion9 wrote: | | Первые плоды услилий Flasher? |
Я не в курсе. Это его предложение?
| Orion9 wrote: | | С каким интервалом? |
Да у меня один дополнительный поток на все. Просто добавляю туда новые функции:
| Code: |
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\CloseNagScr.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\IcoNumber.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\MediaInfo.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\QuitExifTool.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\Restart.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\SetTransparency.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\SwitchAssoc.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\SwitchColor.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\SwitchDrivesIcon.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\SwitchFilesIcon.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\SwitchIniSect.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\SwitchLang.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\SwitchLangUtils.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\SwitchLangWCXPlg.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\SwitchLangWFXPlg.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\SwitchLangWLXPlg.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\SwitchSound.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\SwitchTitleInfo.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\SwitchTypeHints.aucfg
Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\uCharDet.aucfg
RunThread ThreadWatch
Func ThreadWatch
Local cpu, mls
While 1
ThreadWatchLang
ThreadWatchQuitExifTool
ThreadWatchTitleInfo
ThreadWatchUtilsLang
ThreadWatchWCXPlgLang
ThreadWatchWFXPlgLang
ThreadWatchWLXPlgLang
# Отключаем пункты подменю "О сборке" меню "Запуск"
# Disconnect items "About assembly" menu "Start"
DisableMarkedMenuItems "█"
cpu = GetCPUUsage()
If cpu < 60 Then
mls = 500
ElseIf cpu < 90 Then
mls = 700
Else
mls = 900
EndIf
Sleep(mls)
# OutputDebugString("Autorun: AUTORUN_TCLANGFILE = " & AUTORUN_TCLANGFILE)
Wend
EndFunc
# After this line all actions are performed when TC closing
Pragma AutorunFinalizeSection
# RegDelete("HKCU\Environment", "OIT_DATA_PATH")
ShellExec(COMMANDER_PATH & "\Utils\Everything\Everything.exe", "-exit")
ProcessTerminate("~/A /W", "exiftool.exe")
DllCall("kernel32.dll\DeleteFileW", "Wstr", TEMP & "\ET_DOCS_args.txt")
DllCall("kernel32.dll\DeleteFileW", "Wstr", TEMP & "\ET_DOCS_out.txt") |
|
|
| 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
|