GetExtendedFileProperties.ps1
<#PSScriptInfo .VERSION 1.0 .GUID 76d5dcbc-a72c-45ee-b12a-0edc04ee3323 .AUTHOR Pemo .COMPANYNAME .COPYRIGHT .TAGS File Properties .LICENSEURI .PROJECTURI .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES #> <# .DESCRIPTION Get extended file properties #> Param() <# .Synopsis Extend File Properties .Description Get the extended properties of a file with a little help of a friendly COM interface and the Explorer #> function Get-FileProperties { param([Alias("PsPath")][Parameter(ValueFromPipelineByPropertyName=$true)][String]$Path, [String[]]$PropertyName, [Parameter(ParametersetName="All")][Switch]$All, [Parameter(ParametersetName="All")][Switch]$ValuesOnly ) process { $Path = Convert-Path -Path $Path $DirPath = Split-Path -Path $Path $FileName = Split-Path -Path $Path -Leaf $MaxProps = 300 $ShellFolder = (New-Object -ComObject Shell.Application).NameSpace($DirPath) $ShellFile = $ShellFolder.ParseName($FileName) # Sollen alle erweiterten Eigenschaften ausgegeben werden? if ($PSBoundParameters.ContainsKey("All")) { $FileProps = [Ordered]@{Datei=$FileName} # Alle Eigenschaften durchgehen und ihre Werte abfragen for($i=0; $i -lt $MaxProps; $i++) { $PropName = $ShellFolder.GetDetailsOf($null,$i) if ($PropName -ne $null) { $Value = $ShellFolder.GetDetailsOf($ShellFile, $i) if ($PSBoundParameters.ContainsKey("ValuesOnly")) { if ($Value -ne "") { $FileProps += @{$PropName[0] = $Value} } } else { $FileProps += @{$PropName[0] = $Value} } } } # Rückgabe eines Objekts mit allen Eigenschaften und deren Werte [PsCustomObject]$FileProps } else { # Es sollen nur die Eigenschaften abgefragt werden, deren Namen übergeben wurden $FileProps = [Ordered]@{Datei=$FileName} # Alle übergebene Eigenschaften durchgehen foreach($Prop in $PropertyName) { # Alle erweiterten Eigenschaften der Datei durchgehen for($i=0; $i -lt $MaxProps; $i++) { # Stimmt der Name mit dem gewünschten Namen überein? if($ShellFolder.GetDetailsOf($null, $i) -eq $Prop) { # Ja, dann Name und Wert der Eigenschaft als Objekt zur Hashtable hinzufügen $FileProps += @{$Prop = $ShellFolder.GetDetailsOf($ShellFile, $i)} break } } } # Rückgabe eines Objekts mit den gesuchten Eigenschaften und deren Werte [PSCustomObject]$FileProps } } } |