如何使用PowerShell以编程方式访问图像或视频的"采用日期"字段?

JNa*_*ppi 13 powershell

我正在尝试转换一堆图片和视频,但是当我将其转换为新格式时,我忽略了原始文件的属性.我希望能够从旧文件中读取"Date of"属性,并使用PowerShell在新文件上更新它.

EBG*_*een 12

我现在无法测试它(没有任何带有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
Run Code Online (Sandbox Code Playgroud)

  • 这将返回一个咬合数组.要将其转换为[datetime],您需要执行以下操作:``$ bitearr = $ pic.GetPropertyItem(36867).Value $ string = [System.Text.Encoding] :: ASCII.GetString($ bitearr)[datetime ] :: ParseExact($ string,"yyyy:MM:dd HH:mm:ss`0",$ Null)`` (8认同)
  • 或者使用 `$bitearr[0..18]` 省略数组中的空字符并使用 `yyyy:MM:dd HH:mm:ss` 作为日期模式...您现在还可以使用 `Add-Type - AssemblyName System.Drawing`而不是反射。 (3认同)

Emp*_*LII 5

通常,您可以通过shell 方法访问显示在资源管理器中的文件的任何扩展属性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 )
Run Code Online (Sandbox Code Playgroud)


但是,根据对另一个问题的评论,没有设置这些属性的通用机制。EBGreen提到System.Drawing.Bitmap类适用于图像,但恐怕我也不知道用于视频文件的.NET选项。