Как я могу получить программный доступ к поля "Дата взятия" изображения или видео с помощью powershell?

Я пытаюсь преобразовать кучу изображений и видео, но когда я конвертирую его в новый формат, я обвиняю свойства исходного файла. Я хотел бы иметь возможность прочитать свойство "Дата взято" из старого файла и обновить его на новом с помощью powershell.

Ответ 1

Я не могу проверить это прямо сейчас (у меня нет изображений с данными XIF, но я думаю, что это должно работать:

[reflection.assembly]::LoadWithPartialName("System.Drawing")
$pic = New-Object System.Drawing.Bitmap('C:\PATH\TO\SomePic.jpg')
$bitearr = $pic.GetPropertyItem(36867).Value 
$string = [System.Text.Encoding]::ASCII.GetString($bitearr) 
$DateTime = [datetime]::ParseExact($string,"yyyy:MM:dd HH:mm:ss'0",$Null)
$DateTime

Ответ 2

В общем, вы можете получить доступ к любому расширенному свойству для файла, показанного в проводнике, через оболочку GetDetailsOf метод. Вот короткий пример, адаптированный из другого ответа:

$file = Get-Item IMG_0386.jpg
$shellObject = New-Object -ComObject Shell.Application
$directoryObject = $shellObject.NameSpace( $file.Directory.FullName )
$fileObject = $directoryObject.ParseName( $file.Name )

$property = 'Date taken'
for(
  $index = 5;
  $directoryObject.GetDetailsOf( $directoryObject.Items, $index ) -ne $property;
  ++$index ) { }

$value = $directoryObject.GetDetailsOf( $fileObject, $index )


Однако, согласно комментариям по другому вопросу, для свойств не существует универсального механизма. Класс System.Drawing.Bitmap, который EBGreen упомянул, будет работать для изображений, Я боюсь, что я также не знаю опции .NET для видеофайлов.