| View previous topic :: View next topic |
| Author |
Message |
AkulaBig
Joined: 03 Dec 2008 Posts: 562
|
(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: 1122
|
(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: 562
|
(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: 562
|
(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: 562
|
|
| Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 1122
|
(Separately) Posted: Wed May 20, 2026 23:10 Post subject: |
|
|
AkulaBig
Бросайте вы это дело, к чему такая куча костылей? Вы серьезно собрались 30 полей что ли выводить Ну come on же... Всё, что требует горизонтального проручивания неюзабельно, будь то браузер, текстовый редактор или панель ТС.
Даже если вы оставите неколько полей, которые будут помещаться на экран, всё-равно овчинка выделки не стоит. Что такого уникального может предложить exifool, чтобы так загоняться?
| AkulaBig wrote: | | Может у вас есть идеи как перехватить обработку ошибки? |
Речь идет о плагине, или о скрипте? А то я что-то запутался. Если дергание каждого поля приводит к такому результату (а оно судя по всему приводит, я же не зря закомметировал вывод одиночного поля), то единственным выходом остается получать весь выхлоп от утилиты и разбирать его на отдельные поля. |
|
| 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
|