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(Mandatory=$true,ValueFromPipeline)][object[]]$file,[string[]]$properties) [int]$TotItems = $file.Count [int]$Count = 0 if ($file -eq $null){ return $null } Remove-Variable objShell -ErrorAction Ignore | Out-Null $myFolder = $($file.FullName |Split-Path -Parent) $objFolder = Get-ShellFolder -folder $myFolder $shellProperties = New-Object PSObject #https://msdn.microsoft.com/en-us/library/windows/desktop/bb774094(v=vs.85).aspx if($logLevel -eq "Debug"){ Write-Log '$objFolder:' Debug $objFolder.items() | fl } $Count++ [int]$percentComplete = ($Count/$TotItems* 100) foreach ($_File in $objFolder.items() | where {$_.Name -eq $file.name }) { Remove-Variable FileMetaData -ErrorAction Ignore | Out-Null $FileMetaData = New-Object PSOBJECT for ($a = 0 ; $a -le 266; $a++) { if([string]::IsNullOrEmpty($properties) -or $objFolder.getDetailsOf($objFolder.items, $a) -in $properties){ if($objFolder.getDetailsOf($_File, $a)) { $hash += @{$($objFolder.getDetailsOf($objFolder.items, $a)) = $($objFolder.getDetailsOf($_File, $a)) } $shellProperties | Add-Member $hash $hash.clear() } #end if } } #end for $file | Add-Member -type NoteProperty -name ShellProperties -value $shellProperties Write-Output $file } #end foreach $file }Export-ModuleMEmber -Function Get-FileMetaData |