Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Enumerate file properties in PowerShell

I have seen bits of this in other questions, but I am looking for a generic way to write a function that will take a file, and list its properties in such a way that they can be used. I am aware of the function called Get-ItemProperty but it does not list the properties that I am looking for (for example, given a .avi file, it will not tell me the length, frame width, etc).

Am I using the function wrong (all I am doing is: Get-ItemProperty file) or do I have to do this a different way?

I want to be able to say something like $a += $file.Length, or something like that for arbitrary properties.

like image 306
soandos Avatar asked Feb 23 '12 19:02

soandos


2 Answers

Sounds like you are looking for extended file attributes. These are not stored in System.IO.FileInfo.

One way is to use the Shell.Application COM object. Here is some example code:

http://web.archive.org/web/20160201231836/http://powershell.com/cs/blogs/tobias/archive/2011/01/07/organizing-videos-and-music.aspx

Say you had a video file: C:\video.wmv

$path = 'C:\video.wmv'
$shell = New-Object -COMObject Shell.Application
$folder = Split-Path $path
$file = Split-Path $path -Leaf
$shellfolder = $shell.Namespace($folder)
$shellfile = $shellfolder.ParseName($file)

You'll need to know what the ID of the extended attribute is. This will show you all of the ID's:

0..287 | Foreach-Object { '{0} = {1}' -f $_, $shellfolder.GetDetailsOf($null, $_) }

Once you find the one you want you can access it like this:

$shellfolder.GetDetailsOf($shellfile, 216)
like image 57
Andy Arismendi Avatar answered Nov 24 '22 00:11

Andy Arismendi


Another possible method which also uses the Shell.Application COM object but does not require you to know what the ID’s of the extended attributes are. This method is preferred over using the ID’s because ID’s are different in different versions of Window (XP, Vista, 10, etc.)

$FilePath = 'C:\Videos\Test.mp4'
$Folder = Split-Path -Parent -Path $FilePath
$File = Split-Path -Leaf -Path $FilePath
$Shell = New-Object -COMObject Shell.Application
$ShellFolder = $Shell.NameSpace($Folder)
$ShellFile = $ShellFolder.ParseName($File)

Write-Host $ShellFile.ExtendedProperty("System.Title")
Write-Host $ShellFile.ExtendedProperty("System.Media.Duration")
Write-Host $ShellFile.ExtendedProperty("System.Video.FrameWidth")
Write-Host $ShellFile.ExtendedProperty("System.Video.FrameHeight")

The code will display the title of the video (if it is set), duration (100ns units, not milliseconds), and the videos frame width and height.

The names of other extended properties can be found in the file propkey.h, which is part of the Windows SDK.

Additional information:

ShellFolderItem.ExtendedProperty method

Predefined Property Set Format Identifiers

like image 23
Safwan Avatar answered Nov 24 '22 01:11

Safwan