public/Get-FileMetaData.ps1
# ----------------------------------------------------------------------------- # Script: Get-FileMetaDataReturnObject.ps1 # Author: ed wilson, msft # Date: 01/24/2014 12:30:18 # Keywords: Metadata, Storage, Files # comments: Uses the Shell.APplication object to get file metadata # Gets all the metadata and returns a custom PSObject # it is a bit slow right now, because I need to check all 266 fields # for each file, and then create a custom object and emit it. # If used, use a variable to store the returned objects before attempting # to do any sorting, filtering, and formatting of the output. # To do a recursive lookup of all metadata on all files, use this type # of syntax to call the function: # Get-FileMetaData -folder (gci e:\music -Recurse -Directory).FullName # note: this MUST point to a folder, and not to a file. # ----------------------------------------------------------------------------- Function Get-FileMetaData { <# .Synopsis This function gets file metadata and returns it as a custom PS Object .Description This function gets file metadata using the Shell.Application object and returns a custom PSObject object that can be sorted, filtered or otherwise manipulated. .Example Get-FileMetaData -folder "e:\music" Gets file metadata for all files in the e:\music directory .Example Get-FileMetaData -folder (gci e:\music -Recurse -Directory).FullName This example uses the Get-ChildItem cmdlet to do a recursive lookup of all directories in the e:\music folder and then it goes through and gets all of the file metada for all the files in the directories and in the subdirectories. .Example Get-FileMetaData -folder "c:\fso","E:\music\Big Boi" Gets file metadata from files in both the c:\fso directory and the e:\music\big boi directory. .Example $meta = Get-FileMetaData -folder "E:\music" This example gets file metadata from all files in the root of the e:\music directory and stores the returned custom objects in a $meta variable for later processing and manipulation. .Parameter Folder The folder that is parsed for files .Notes NAME: Get-FileMetaData AUTHOR: ed wilson, msft LASTEDIT: 01/24/2014 14:08:24 KEYWORDS: Storage, Files, Metadata HSG: HSG-2-5-14 .Link Http://www.ScriptingGuys.com #Requires -Version 2.0 #> [CmdletBinding(SupportsShouldProcess=$true)] Param([Parameter(ValueFromPipeline)][object[]]$file) process{ foreach($sfile in $file) { $a = 0 Remove-Variable objShell -ErrorAction Ignore | Out-Null $myFolder = $($sfile.FullName |Split-Path -Parent) $objFolder = Get-ShellFolder -folder $myFolder $objShell = New-Object -ComObject Shell.Application $outThing = $objShell.namespace("$myFolder") foreach ($File in $objFolder.items() | where {$_.Name -eq $sfile.name }) { Remove-Variable FileMetaData -ErrorAction Ignore | Out-Null $FileMetaData = New-Object PSOBJECT for ($a ; $a -le 266; $a++) { if($objFolder.getDetailsOf($File, $a)) { $hash += @{$($objFolder.getDetailsOf($objFolder.items, $a)) = $($objFolder.getDetailsOf($File, $a)) } $FileMetaData | Add-Member $hash $hash.clear() } #end if } #end for $a=0 Write-Output (,$FileMetaData) } #end foreach $file } #end foreach $sfolder } }Export-ModuleMEmber -Function Get-FileMetaData |