| Single Post |
Topic: Autorun |
| Author |
Message |
Orion9

|
Posted: Fri May 22, 2026 12:46 Post subject: |
|
|
| AkulaBig wrote: | | Почему вы думаете, что я не изучаю документацию? |
Я прикалываюсь. Но если вы серьезно хотите в этом разбираться, то от изучения именно всей документации exiftool вам не уйти. Нужно знать все теги, форматы, ключи. А это процесс небыстрый, быстрого результата не будет. Поэтому... я бы бросил
| AkulaBig wrote: | | Но одна строчка про -@ - не особо помогла. |
Самый простой вариант: Google -> Поиск -> "exiftool" -> Режим ИИ:
 Запрос | Code: | #Requires AutoHotkey v2.0
; 1. Конфигурация путей
exiftoolPath := "C:\Windows\exiftool.exe"
targetFile := "C:\Photos\image.jpg"
; 2. Формируем список аргументов (строго по одному на строку)
; Опция -S делает вывод компактным (Тег: Значение)
argsContent :=
(
"-S"
"-Artist=Новый Автор"
"-Copyright=2026 Студия"
)
; Добавляем путь к файлу в конец списка команд
argsContent .= "`n" targetFile
; 3. Запускаем процесс ExifTool с флагами чтения из stdin (-@ -)
shell := ComObject("Wscript.Shell")
exec := shell.Exec('"' exiftoolPath '" -@ -')
; 4. Отправляем команды в поток stdin программы
exec.StdIn.WriteLine(argsContent)
exec.StdIn.Close() ; Закрываем поток, чтобы ExifTool понял, что передача команд окончена, и начал выполнение
; 5. Считываем результат работы (stdout) из ExifTool в переменную
output := exec.StdOut.ReadAll()
; 6. Показываем результат
MsgBox(output, "Результат ExifTool")
необходимо развить этот скрипт, уточните:Нужно ли обрабатывать несколько файлов по очереди в одном долгоживущем процессе ExifTool (режим -stay_open) |
 Ответ | Code: | Использование режима -stay_open — это лучший способ оптимизировать скрипт, если вам нужно обработать множество файлов.Запуск exiftool.exe для каждого отдельного файла создает огромную нагрузку на процессор. Процесс запускается медленно, так как каждый раз заново загружает в память сотни модулей Perl [1]. Режим -stay_open позволяет запустить ExifTool один раз на всё время работы скрипта и мгновенно передавать ему команды через stdin [2].Ниже представлен готовый, развитый шаблон скрипта на AutoHotkey v2.0, который реализует этот профессиональный подход.Скрипт AHK v2.0 с поддержкой -stay_openautohotkey#Requires AutoHotkey v2.0
#SingleInstance Force
; ==============================================================================
; 1. ИНИЦИАЛИЗАЦИЯ ДОЛГОЖИВУЩЕГО ПРОЦЕССА EXIFTOOL
; ==============================================================================
exiftoolPath := "C:\Windows\exiftool.exe"
; Флаги запуска:
; -stay_open True : указывает ExifTool не закрываться после выполнения команды
; -@ - : указывает читать аргументы из стандартного ввода (stdin)
shell := ComObject("Wscript.Shell")
exec := shell.Exec('"' exiftoolPath '" -stay_open True -@ -')
; ==============================================================================
; 2. ПРИМЕР ОБРАБОТКИ ФАЙЛОВ ПО ОЧЕРЕДИ
; ==============================================================================
; Массив файлов для демонстрации последовательной обработки
filesToProcess := [
"C:\Photos\photo1.jpg",
"C:\Photos\photo2.jpg",
"C:\Photos\photo3.jpg"
]
; Перебираем файлы в цикле
for index, targetFile in filesToProcess {
; Формируем пакет аргументов для текущего файла.
; Каждая опция и значение должны быть на новой строке.
cmd := "-Artist=Автор " index "`n"
cmd .= "-Copyright=2026 Студия`n"
cmd .= targetFile "`n" ; Путь к файлу передается в конце пакета команд
cmd .= "-execute" ; ОБЯЗАТЕЛЬНО: сообщает ExifTool, что этот пакет команд пора выполнить
; Отправляем команду в поток stdin
exec.StdIn.WriteLine(cmd)
; Считываем ответ конкретно для этого файла
response := ReadResponse(exec.StdOut)
; Выводим промежуточный результат (можно заменить на Лог-файл или GUI)
MsgBox("Файл " index " обработан!`n`nОтвет ExifTool:`n" response, "Статус обработки")
}
; ==============================================================================
; 3. ПРАВИЛЬНОЕ ЗАКРЫТИЕ EXIFTOOL ПРИ ВЫХОДЕ ИЗ СКРИПТА
; ==============================================================================
; Посылаем команду закрытия перед завершением работы скрипта
ExitRoutine(*) {
global exec
if (exec.Status == 0) { ; Если процесс еще запущен
try {
exec.StdIn.WriteLine("-stay_open`nFalse") ; Корректная команда выхода для ExifTool
exec.StdIn.Close()
}
}
}
OnExit(ExitRoutine)
ExitApp()
; ==============================================================================
; ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ
; ==============================================================================
; Функция построчного чтения ответа до маркера окончания выполнения ({ready})
ReadResponse(stdOutStream) {
output := ""
while !stdOutStream.AtEndOfStream {
line := stdOutStream.ReadLine()
; ExifTool по умолчанию выводит "{ready}" на новой строке после завершения -execute
if (Trim(line) == "{ready}")
break
output .= line "`n"
}
return Trim(output)
}
Используйте код с осторожностью.Как это работает:Флаг -stay_open True: Программа запускается в фоне и "слушает" поток stdin [2].Маркер -execute: ExifTool не начнет обрабатывать файл, пока не увидит эту строку. Она служит разделителем между командами [2].Маркер {ready}: После выполнения команды -execute программа выводит в stdout текст {ready} [2]. Наша функция ReadResponse ждет это слово, чтобы скрипт не завис на чтении пустого потока.Завершение -stay_open False: Строго обязательная команда при закрытии скрипта, иначе скрытый процесс exiftool.exe останется "висеть" в Диспетчере задач Windows [2].Чтобы мы могли развить этот скрипт под вашу реальную задачу, ответьте:Откуда скрипт будет брать файлы (выбор папки целиком, выделенные файлы в Проводнике или просто Drag-and-Drop на окно скрипта)?Нужно ли делать фильтрацию по расширениям (например, обрабатывать только .jpg и .mp4, игнорируя .txt)?Требуется ли выводить прогресс-бар или общее окно логов вместо назойливых MsgBox? |
И т.д. пока болван не треснет
Быстрее бы уже Loopback или кто-нибудь научил болвана понимать язык Autorun — вот тогда мы заживём  |
|
|
|
 |
|
Powered by phpBB © 2001, 2005 phpBB Group
|