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