Orion9

|
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, чтобы русские теги (вроде копирайта или авторов) не превращались в "кракозябры".
|
|
|