Серия «Философия PowerShell». Полное руководство по ExifTool и PowerShell (Out-ConsoleGridView)
Дисклеймер. В пикабу нет редактора кода - поэтому такое форматирование и картинки. В конце поста я дам ссылку на github. Почитайте, и если вам интересно, смотрите код на гитхабе.
Каждый раз, когда вы делаете фотографию, ваша камера записывает в файл не только само изображение, но и служебную информацию: модель камеры и объектива, дату и время съемки, выдержку, диафрагму, ISO, GPS-координаты. Эти данные называются EXIF (Exchangeable Image File Format).
Хотя PowerShell имеет встроенные средства для чтения некоторых метаданных, они ограничены. Чтобы получить доступ ко всей информации, нужен специализированный инструмент. В этой статье я использую ExifTool.
ExifTool — это бесплатная, кросс-платформенная утилита с открытым исходным кодом, написанная Филом Харви. Она является золотым стандартом для чтения, записи и редактирования метаданных в самых разных форматах файлов (изображения, аудио, видео, PDF и др.). ExifTool знает тысячи тегов от сотен производителей устройств, что делает его самым всеобъемлющим инструментом в своем классе.
Скачивание ExifTool и правильная настройка
Прежде чем писать код, нужно подготовить саму утилиту.
Зайдите на официальный сайт ExifTool: https://exiftool.org/. На главной странице найдите и скачайте "Windows Executable".
Переименование (Критически важный шаг!): Скачанный файл будет называться exiftool(-k).exe. Это не случайность, а специальная функция для удобства пользователей, которые работают с программой через графический интерфейс Windows, а не через командную строку.
Переименуйте его в exiftool.exe, чтобы отключить режим "паузы", который предназначен для пользователей, запускающих программу двойным щелчком мыши. Когда вы запускаете программу из скрипта, PowerShell ожидает, что она выполнит свою задачу, вернет результат (текст, данные) и завершится. Режим с паузой (-k) нарушает этот процесс
Хранение: У вас есть два основных варианта, где хранить exiftool.exe.
Вариант 1 (Простой): В той же папке, что и ваш скрипт. Это самый легкий путь. Ваш скрипт PowerShell всегда сможет найти утилиту, так как она лежит рядом. Идеально для портативных скриптов, которые вы переносите с компьютера на компьютер.
Вариант 2 (Рекомендуемый для частого использования): В папке из системной переменной PATH. Переменная PATH — это список директорий, где Windows и PowerShell автоматически ищут исполняемые файлы. Вы можете создать папку (например, C:\Tools), положить туда exiftool.exe и добавить C:\Tools в системную переменную PATH. После этого вы сможете вызывать exiftool.exe из любой папки в любой консоли.
скрипты для добавления в $PATH:
Добавление директории в PATH для ТЕКУЩЕГО ПОЛЬЗОВАТЕЛЯ
Добавление директории в СИСТЕМНЫЙ PATH для ВСЕХ ПОЛЬЗОВАТЕЛЕЙ
PowerShell и внешние программы
Чтобы эффективно использовать ExifTool, нужно знать, как PowerShell запускает внешние .exe файлы. Правильный и самый надежный способ запуска внешних программ — это оператор вызова & (амперсанд). PowerShell выдаст ошибку в случае, если путь к программе содержит пробелы. Например, C:\My Tools\exiftool.exe. & (амперсанд)** говорит PowerShell: "Текст, который следует за мной в кавычках, — это путь к исполняемому файлу. Запусти его, а всё, что идет дальше, — это его аргументы".
# Правильный синтаксис
> & "C:\Path With Spaces\program.exe" "аргумент 1" "аргумент 2"
Всегда используйте &, когда работаете с путями к программам в переменных или путями, которые могут содержать пробелы.
ExifTool + PowerShell
Теперь объединим наши знания.
Пример №1: Базовое извлечение и интерактивный просмотр
Самый простой способ получить все данные из фото и изучить их — это запросить их в формате JSON и передать в Out-ConsoleGridView (ogv).
Путь к фото
> $photoPath = "E:\photos\1234.png"
1. Запускаем exiftool с ключом -json для структурированного вывода
2. Преобразуем JSON-текст в объект PowerShell
Вызываем exiftool.exe напрямую, без переменной и оператора вызова &.
> $exifObject = exiftool.exe -json $photoPath | ConvertFrom-Json
3. Превращаем "широкий" объект в удобную таблицу "Параметр-Значение"
> $reportData = $exifObject.psobject.Properties | Select-Object Name, Value
4. Выводим результат в интерактивное окно для анализа
> $reportData | Out-ConsoleGridView -Title "Метаданные файла: $($photoPath | Split-Path -Leaf)"
Этот код откроет интерактивное окно, где вы сможете отсортировать данные по имени параметра или значению, а также отфильтровать их, просто начав вводить текст. Это невероятно удобно для быстрого поиска нужной информации.
Пример №2: Создание чистого отчета и отправка на разные "устройства"
Out-ConsoleGridView — это только начало. Вы можете направить обработанные данные куда угодно, используя другие командлеты Out-*.
Предположим, у нас есть данные в переменной $reportData из предыдущего примера.
А) Отправка в CSV-файл для Excel
Создаем директорию Reports:
> New-Item -Path "C:\Reports" -ItemType Directory
Сохраняем CSV
> $reportData | Export-Csv -Path "C:\Reports\photo_exif.csv" -NoTypeInformation -Encoding UTF8
В) Отправка в буфер обмена
Хотите быстро вставить данные в письмо или чат? Используйте Out-Clipboard.
> $reportData | Format-Table -AutoSize | Out-String | Out-Clipboard
Теперь вы можете нажать `Ctrl+V` в любом текстовом редакторе и вставить аккуратно отформатированную таблицу.
Пример №3: Получение конкретных данных для использования в скрипте
Часто вам не нужен весь отчет, а лишь одно или два значения. Поскольку $exifObject — это обычный объект PowerShell, вы можете легко обращаться к его свойствам.
Пример №4: Пакетное извлечение метаданных из папки
Иногда нужно проанализировать не одно фото, а целую папку с изображениями.
Пример №5: Рекурсивный поиск по подпапкам
ExifTool умеет сам искать файлы во всех подпапках при использовании ключа -r.
Пример №6: Переименование файлов по дате съемки
Это один из самых популярных сценариев автоматизации — файлы получают имена по дате/времени съемки.
> $exifToolPath = "C:\Tools\exiftool.exe" $photoFolder = "D:\Photos" # Переименуем в формат YYYY-MM-DD_HH-MM-SS.jpg & $exifToolPath -r -d "%Y-%m-%d_%H-%M-%S.%%e" "-FileName<DateTimeOriginal" $photoFolder
💡 ExifTool подставит расширение исходного файла автоматически через %%e.
Пример №7: Извлечение только GPS-координат
Полезно, если вы хотите построить карту по вашим фото.
Пример №8: Массовое удаление всех GPS-данных (для приватности)
# Удалим все GPS-теги из JPG и PNG
> & $exifToolPath -r -overwrite_original -gps:all= "D:\Photos"
💡 Это действие необратимо, поэтому делайте бэкап перед выполнением.
Пример №9: Конвертация времени съемки в местное время
Иногда фото сняты в другом часовом поясе. ExifTool может сместить дату.
# Смещаем время на +3 часа
> & $exifToolPath "-AllDates+=3:0:0" "D:\Photos\IMG_*.JPG"
Пример №13: Копирование метаданных с одного файла на другой
Пример №14: Сохранение исходных метаданных в отдельный JSON перед изменением
> $backupPath = "C:\Reports\metadata_backup.json" & $exifToolPath -r -json "D:\Photos" | Out-File -Encoding UTF8 $backupPath
Пример №15: Использование PowerShell для автоматической сортировки фото по дате
Пример 16: Поиск всех уникальных моделей камер в коллекции
Хотя это можно сделать одной строкой, вывод в GridView позволяет сразу скопировать нужное название модели.
Ключ -s3 выводит только значения, -Model - название тега
> $uniqueModels = & exiftool.exe -r -Model -s3 "D:\Photos" | Sort-Object -Unique
Выводим в GridView для удобного просмотра и копирования
> $uniqueModels | Out-ConsoleGridView -Title "Уникальные модели камер в коллекции"
Статья на github
Еще по теме Out-ConsoleGridView:
Философия PowerShell. Часть 4. Интерактивная работа: Out-ConsoleGridView
Серия «Философия PowerShell». Практические примеры использования Out-ConsoleGridView
Полезно? Подпишись.
Понравилось — ставь «+»
Задавай вопросы в комментариях 👇👇👇
Удачи! 🚀