Orion9

|
Posted: Wed Apr 15, 2026 19:14 Post subject: |
|
|
| AkulaBig wrote: | | Я все что можно пробовал. |
А вот так пробовали?
 au3 | Code: | В AutoIt работа с -stay_open строится аналогично: мы создаем процесс один раз и общаемся с ним через текстовый файл. Для чтения данных (StdOut) в AutoIt удобнее всего использовать встроенную функцию StdoutRead, которая позволяет забирать текст прямо из памяти процесса без создания лишних временных файлов.
Вот полный пример реализации:
autoit
#include <Constants.au3>
; --- Конфигурация ---
Global $sExifPath = "exiftool.exe" ; Путь к exiftool
Global $sArgFile = @TempDir & "\exiftool_args.txt"
; 1. Подготовка файла аргументов
FileDelete($sArgFile)
FileWrite($sArgFile, "")
; 2. Запуск процесса ExifTool (один раз)
; Используем $STDIN_CHILD + $STDOUT_CHILD для взаимодействия
Global $iPID = Run($sExifPath & ' -stay_open True -@ "' & $sArgFile & '"', "", @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
; --- Примеры использования ---
; Читаем модель камеры
$sModel = _ExifTool_GetTag("photo.jpg", "Model")
MsgBox(64, "Результат", "Модель камеры: " & $sModel)
; Читаем дату создания
$sDate = _ExifTool_GetTag("photo.jpg", "CreateDate")
MsgBox(64, "Результат", "Дата создания: " & $sDate)
; Закрываем ExifTool
_ExifTool_Quit()
; --- Функция получения данных ---
Func _ExifTool_GetTag($sFile, $sTag)
; Очищаем буфер перед командой (на всякий случай)
StdoutRead($iPID)
; Формируем команду
; -s3: только значение, -S: краткий формат, -echo4: выводит маркер в StdOut после завершения
Local $sCmd = "-s3" & @LF & "-" & $sTag & @LF & $sFile & @LF & "-echo4" & @LF & "{ready}" & @LF & "-execute" & @LF
; Записываем команду в файл аргументов
Local $hFile = FileOpen($sArgFile, 1) ; 1 = Write mode (append)
FileWrite($hFile, $sCmd)
FileClose($hFile)
; Ждем ответа в StdOut
Local $sOut = ""
Local $iTimer = TimerInit()
While 1
$sOut &= StdoutRead($iPID)
If StringInStr($sOut, "{ready}") Then ExitLoop ; Ищем наш маркер завершения
If TimerDiff($iTimer) > 2000 Then Return "Error: Timeout" ; Таймаут 2 сек
Sleep(10)
WEnd
; Очищаем результат от маркера и лишних пробелов
$sOut = StringReplace($sOut, "{ready}", "")
Return StringStripWS($sOut, 3)
EndFunc
; --- Функция закрытия ---
Func _ExifTool_Quit()
Local $hFile = FileOpen($sArgFile, 1)
FileWrite($hFile, "-stay_open" & @LF & "False" & @LF)
FileClose($hFile)
ProcessWaitClose($iPID, 2)
FileDelete($sArgFile)
EndFunc
Используйте код с осторожностью.
Ключевые моменты этого примера:
-echo4 {ready}: ExifTool выводит этот текст в поток Standard Output сразу после того, как команда выполнена. Это позволяет AutoIt понять, что данные получены полностью и можно двигаться дальше.
StdoutRead: Данные попадают из консоли ExifTool прямо в переменную $sOut.
@LF: ExifTool в файле аргументов требует, чтобы каждый параметр был на новой строке.
Производительность: Поскольку процесс не перезапускается, чтение каждого последующего тега происходит почти мгновенно (миллисекунды).
Хотите ли вы дополнить скрипт функцией записи метаданных (например, массовой простановки копирайта)?
ИИ может ошибаться. Советуем проверять его ответы. |
 vbs | Code: | В VBScript работа с -stay_open является наиболее сложной, так как этот язык не имеет встроенных средств для прямой работы со стандартными потоками (StdIn/StdOut) уже запущенного процесса так же гибко, как AutoIt или AHK.
Наиболее надежный способ для VBScript — общение через два файла: один для команд (argfile), второй для вывода (output).
Полный пример (VBScript)
vbscript
Option Explicit
Dim fso, shell, argFile, outFile, exifPath
Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("WScript.Shell")
' --- Конфигурация ---
exifPath = "exiftool.exe" ' Путь к exiftool
argFile = fso.GetSpecialFolder(2) & "\exiftool_args.txt" ' Временная папка
outFile = fso.GetSpecialFolder(2) & "\exiftool_out.txt"
' 1. Подготовка файлов
If fso.FileExists(argFile) Then fso.DeleteFile(argFile)
If fso.FileExists(outFile) Then fso.DeleteFile(outFile)
fso.CreateTextFile(argFile).Close
' 2. Запуск процесса ExifTool (один раз)
' Процесс будет ждать появления команд в argFile
shell.Run Chr(34) & exifPath & Chr(34) & " -stay_open True -@ " & Chr(34) & argFile & Chr(34), 0, False
' --- Примеры использования ---
MsgBox "Модель камеры: " & GetExifTag("photo.jpg", "Model")
MsgBox "Дата съемки: " & GetExifTag("photo.jpg", "CreateDate")
' Завершение работы
QuitExifTool
' --- Функции ---
Function GetExifTag(fileName, tagName)
Dim stream, result
' Если файл вывода существует, удаляем его перед новой командой
If fso.FileExists(outFile) Then fso.DeleteFile(outFile)
' Формируем блок команд
' -s3 (только значение), -w! (записать вывод в файл и перезаписать его)
Set stream = fso.OpenTextFile(argFile, 8) ' 8 = Append
stream.WriteLine "-s3"
stream.WriteLine "-" & tagName
stream.WriteLine fileName
stream.WriteLine "-w!"
stream.WriteLine outFile
stream.WriteLine "-execute"
stream.Close
' Ожидаем появления файла с результатом (цикл ожидания)
Dim timeout
timeout = 0
Do While Not fso.FileExists(outFile) And timeout < 200 ' 2 секунды таймаут
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
Sub QuitExifTool()
Dim stream
Set stream = fso.OpenTextFile(argFile, 8)
stream.WriteLine "-stay_open"
stream.WriteLine "False"
stream.Close
WScript.Sleep 500 ' Даем время на закрытие
If fso.FileExists(argFile) Then fso.DeleteFile(argFile)
If fso.FileExists(outFile) Then fso.DeleteFile(outFile)
End Sub
Используйте код с осторожностью.
Разбор особенностей для VBScript:
Chr(34): Используется для вставки кавычек в строку пути, чтобы скрипт не "ломался" на пробелах в путях к файлам.
shell.Run ..., 0, False: Запускает ExifTool скрыто (0) и не ждет его завершения (False), так как процесс должен работать параллельно со скриптом.
fso.OpenTextFile(argFile, 8): Режим 8 (Append) критически важен. Мы постоянно дописываем новые инструкции в конец файла, а ExifTool считывает их по мере поступления после маркера -execute.
Синхронизация через файл: Поскольку VBScript не умеет эффективно слушать поток StdOut в реальном времени без блокировки, мы заставляем ExifTool записывать результат в outFile с помощью ключа -w!. Как только файл появился на диске — данные готовы.
Нужно ли добавить в пример обработку сразу нескольких файлов (массовое чтение) для еще большей скорости? |
 aucfg Сейчас с болваном можно что угодно пробовать, разве что с Autorun он не умеет работать. Ну ничего... Loopback вернется — научит  |
|