powershellpowershell-2.0

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.


Solution

  • 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)