| View previous topic :: View next topic |
| Author |
Message |
AkulaBig
Joined: 03 Dec 2008 Posts: 571
|
(Separately) Posted: Fri May 22, 2026 08:06 Post subject: |
|
|
Orion9
Разобраться-бы с -@ -. Не понятно, почему в вашем примере на ahk нет параметра -stay_open. Думаю болван ошибся. |
|
| Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 1133
|
(Separately) Posted: Fri May 22, 2026 11:38 Post subject: |
|
|
| AkulaBig wrote: | | Разобраться-бы с -@ - |
Это всего лишь один параметр, а вам придется изучать всю документацию, никуда вы от этого не денетесь
| AkulaBig wrote: | | Не понятно, почему в вашем примере на ahk нет параметра -stay_open. Думаю болван ошибся. |
Нет, в этом случае болван не ошибся. Он сделал пример для одиночного запроса через stdin и получения одиночного ответа через stdout, о чем и написал
| Болван wrote: | Критические правила при работе с -@ -Закрытие потока: Метод exec.StdIn.Close() обязателен. Пока поток открыт, ExifTool будет бесконечно ждать продолжения ввода и зависнет.Кавычки не нужны: Внутри строки argsContent пути к файлам и текстовые значения с пробелами нельзя оборачивать в кавычки.Символы перевода строки: Каждая опция и её значение должны разделяться стандартным символом новой строки (``n`).Если вам необходимо развить этот скрипт, уточните:Нужно ли обрабатывать несколько файлов по очереди в одном долгоживущем процессе ExifTool (режим -stay_open)?Требуется ли обрабатывать ошибки, возникающие при работе утилиты (чтение потока StdErr)?Какого формата данные вы хотите извлечь из файла (строки, JSON или XML)?
https://forum.wincmd.ru/viewpost.php?p=141380 |
А так-то да, он может и чушь иногда написать, нужно быть к этому готовым. |
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 571
|
(Separately) Posted: Fri May 22, 2026 11:47 Post subject: |
|
|
| Orion9 wrote: | | никуда вы от этого не денетесь |
Почему вы думаете, что я не изучаю документацию? Но одна строчка про -@ - не особо помогла. |
|
| Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 1133
|
(Separately) 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 — вот тогда мы заживём  |
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 571
|
(Separately) Posted: Fri May 22, 2026 13:01 Post subject: |
|
|
| Orion9 wrote: | | И т.д. пока болван не треснет |
У меня толком ничего не получается. Составлять правильно запрос тоже надо уметь. Собственно простой поиск тоже не мало инфы выдает. Но с ИИ не сравнить. |
|
| Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 1133
|
(Separately) Posted: Fri May 22, 2026 13:13 Post subject: |
|
|
| AkulaBig wrote: | | Составлять правильно запрос тоже надо уметь. |
Да бросьте вы. Болван заводится с полпинка понимает с полуслова
 Запрос расскажи подробнее об опции -@- в exiftool и об устройстве stdin stdout
 Ответ | Code: | Опция -@ и механизмы stdin/stdout — это фундамент, на котором строится скоростная и автоматизированная работа с ExifTool. Без них обработка тысяч файлов превращается в кошмар для процессора.
Разберем детально обе составляющие.
------------------------------
## 1. Что такое stdin и stdout простыми словами
В операционных системах (Windows, Linux, macOS) каждый запускаемый консольный процесс по умолчанию получает три стандартных потока данных (или «трубы»):
1. stdin (Standard Input / Стандартный ввод) — поток, через который программа принимает текстовые данные. Обычно туда попадает то, что пользователь печатает на клавиатуре в консоли. В автоматизации мы программно «вталкиваем» туда текст из AutoHotkey.
2. stdout (Standard Output / Стандартный вывод) — поток, куда программа выводит результаты своей успешной работы. В консоли этот текст печатается на экране. Скрипт AHK перехватывает этот поток и сохраняет в переменную для анализа.
3. stderr (Standard Error / Стандартная ошибка) — отдельный поток для сообщений об ошибках. Разделение нужно, чтобы ошибки не смешивались с полезными данными (например, при сохранении вывода в файл).
## Почему это важно для ExifTool?
Каждое создание нового процесса exiftool.exe в Windows занимает от 50 до 200 миллисекунд. Если у вас 10 000 фотографий, запуск процесса на каждый файл займет до получаса только на инициализацию.
Используя stdin и stdout, мы запускаем ExifTool один раз, а затем общаемся с ним со скоростью оперативной памяти, передавая команды текстом.
------------------------------
## 2. Опция -@ (Файл аргументов)
Официально опция -@ (читается как «at-знак» или «собака») указывает ExifTool прочитать аргументы командной строки из файла, а не из самой командной строки.
## Классическое использование (с физическим файлом):
Представьте, что у вас есть текстовый файл commands.txt с таким содержимым:
-S
-Artist=Иван Иванов
-Copyright=2026
C:\Photos\image.jpg
Если вы выполните команду exiftool -@ commands.txt, программа откроет этот файл, построчно прочитает параметры и выполнит их точно так же, как если бы вы написали длинную команду вручную.
## Правила синтаксиса внутри файла аргументов:
1. Строго один аргумент на строку. Вы не можете написать -Artist=Иван -Copyright=2026 на одной строчке.
2. Никаких кавычек для экранирования пробелов. В обычной консоли вы обязаны писать -Artist="Иван Иванов", иначе пробел разобьет команду. Внутри файла аргументов кавычки не нужны (и даже вредны), так как разделителем служит сам перенос строки. Пишется просто: -Artist=Иван Иванов.
------------------------------
## 3. Магия связки -@ -
Когда вы пишете дефис после опции: -@ -, вы даете команду:
«ExifTool, читай аргументы не из физического файла на диске, а прямо из потока stdin!»
Программа замирает и начинает ждать, пока ваш скрипт (например, на AutoHotkey) не запишет текстовые строки в её поток ввода.
## Как это работает пошагово на примере вашего скрипта:
graph TD
A[AHK Скрипт] -- WriteLine --> B(Поток stdin)
B --> C[Запущенный ExifTool]
C -- Обработка файла --> C
C -- WriteLine --> D(Поток stdout)
D --> E[AHK Скрипт: ReadLine]
1. Запуск: shell.Exec('exiftool -stay_open True -@ -')
ExifTool запускается, видит -stay_open True (не закрываться после первой задачи) и -@ - (слушать поток). Он уходит в режим ожидания.
2. Передача команды: Скрипт отправляет в stdin строки:
-Artist=Новый Автор
C:\Photos\image.jpg
-execute
3. Триггер -execute: Для ExifTool строка -execute — это сигнал: «Пакет аргументов закончился, выполняй!». Он считывает метаданные или записывает их в файл.
4. Ответ: Выполнив задачу, ExifTool отправляет текстовый результат работы в свой поток stdout. В самом конце ответа он всегда дописывает строку {ready} (это зашито в его логику работы с ключом -stay_open).
5. Ожидание в AHK: Наш скрипт в цикле while читает stdout строка за строкой. Как только скрипт видит строку {ready}, он понимает, что ExifTool закончил текущую задачу и вернулся в режим ожидания. Цикл чтения завершается, и скрипт может отправлять команды для следующего файла.
------------------------------
## Главные подводные камни при работе со stdin/stdout
1. Буферизация потоков (Зависание): Если вы забудете отправить команду -execute или не добавите символ переноса строки (\n) в самом конце, ExifTool будет бесконечно ждать продолжения ввода, а ваш скрипт зависнет на попытке прочитать ответ.
2. Кодировка текста: По умолчанию Windows использует кодировку CP1251 или OEM-866 для консоли, а ExifTool ожидает UTF-8 для сохранения интернациональных символов (например, русских букв в именах авторов). При работе через COM-объект Wscript.Shell может потребоваться отправлять текст в правильной кодировке или использовать опцию ExifTool -charset filename=utf8.
Если вы хотите оптимизировать скрипт для обработки папок с файлами, дайте знать — мы можем добавить в него автоматическую кодировку UTF-8, чтобы русские теги (вроде копирайта или авторов) не превращались в "кракозябры".
|
|
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 571
|
(Separately) Posted: Sat May 23, 2026 10:43 Post subject: |
|
|
Orion9
Забил запрос в Гугл, нажал Режим ИИ. Ничего похожего на ваш ответ. Напишите подробней, как вы ищите. |
|
| Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 1133
|
(Separately) Posted: Sat May 23, 2026 12:08 Post subject: |
|
|
| AkulaBig wrote: | | Ничего похожего на ваш ответ. |
Ответ может быть непохожим, т.к. он зависит от контескта чата, но в общих чертах должен совпадать.
| AkulaBig wrote: | | Напишите подробней, как вы ищите. |
Так я и написал подробно, куда же еще подробнее. Даже не знаю, что у вас не получается. Ну попробуйте других болванов, их там сейчас вагон с телегой. Из самых простых и доступных:
https://duck.ai/
https://search.brave.com/ask |
|
| 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
|