Powershell读取大文件的元数据

时间:2012-07-10 22:43:33

标签: powershell metadata

我有一个脚本循环遍历我拍摄的大量图像,并读取焦距和图像。相机型号,显示焦距和总数的图形(这对于帮助确定下一个镜片购买非常有用,但除了这一点之外)。

这对于10 MB以下的JPG图像非常有效,但只要它接近20 MB的RAW文件(如佳能的CR2格式),它就会吐出“Out of Memory”错误。

有没有办法在Powershell中增加内存限制,或者只是在不加载整个文件的情况下读取文件的元数据..?

这就是我目前使用的:

# load image by statically calling a method from .NET
$image = [System.Drawing.Imaging.Metafile]::FromFile($file.FullName)

# try to get the ExIf data (silently fail if the data can't be found)
# http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html
try
{
  # get the Focal Length from the Metadata code 37386
  $focalLength = $image.GetPropertyItem(37386).Value[0]
  # get model data from the Metadata code 272
  $modelByte = $image.GetPropertyItem(272)
  # convert the model data to a String from a Byte Array
  $imageModel = $Encode.GetString($modelByte.Value)
  # unload image
  $image.Dispose()
}
catch
{
  #do nothing with the catch
}

我尝试过使用此处的解决方案:http://goo.gl/WY7Rg但CR2文件只会在任何属性上返回空白...

任何帮助都非常感谢!

2 个答案:

答案 0 :(得分:5)

问题是当发生错误时图像对象没有被处理掉。发生错误时执行会退出try块,这意味着Dispose调用永远不会执行,并且永远不会返回内存。

要解决此问题,您必须将$image.Dispose()调用放在try / catch结尾的finally块中。喜欢这个

try
{
  /* ... */
}
catch
{
  #do nothing with the catch
}
finally
{
  # ensure image is always unloaded by placing this code in a finally block
  $image.Dispose()
}

答案 1 :(得分:0)

我使用this module获取图片上的EXIF数据。 我从来没有在.CR2上测试它,但在.CRW大约15MB上测试它。

试试并告诉我。