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.
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)
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With