15

Серия «Философия PowerShell». Полное руководство по ExifTool и PowerShell (Out-ConsoleGridView)

Серия Философия PowerShell

Дисклеймер. В пикабу нет редактора кода - поэтому такое форматирование и картинки. В конце поста я дам ссылку на github. Почитайте, и если вам интересно, смотрите код на гитхабе.

Каждый раз, когда вы делаете фотографию, ваша камера записывает в файл не только само изображение, но и служебную информацию: модель камеры и объектива, дату и время съемки, выдержку, диафрагму, ISO, GPS-координаты. Эти данные называются EXIF (Exchangeable Image File Format).

Хотя PowerShell имеет встроенные средства для чтения некоторых метаданных, они ограничены. Чтобы получить доступ ко всей информации, нужен специализированный инструмент. В этой статье я использую ExifTool.

ExifTool — это бесплатная, кросс-платформенная утилита с открытым исходным кодом, написанная Филом Харви. Она является золотым стандартом для чтения, записи и редактирования метаданных в самых разных форматах файлов (изображения, аудио, видео, PDF и др.). ExifTool знает тысячи тегов от сотен производителей устройств, что делает его самым всеобъемлющим инструментом в своем классе.

Скачивание ExifTool и правильная настройка

Прежде чем писать код, нужно подготовить саму утилиту.

  1. Зайдите на официальный сайт ExifTool: https://exiftool.org/. На главной странице найдите и скачайте "Windows Executable".

  2. Переименование (Критически важный шаг!): Скачанный файл будет называться 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

Вся Серия постов о PowerShell

Полезно? Подпишись.
Понравилось — ставь «+»
Задавай вопросы в комментариях 👇👇👇
Удачи! 🚀

Лига Сисадминов

2.4K пост19K подписчиков

Правила сообщества

Мы здесь рады любым постам связанным с рабочими буднями специалистов нашей сферы деятельности.

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества