Erweiterte Dateieigenschaften mit Powershell-Funktion abfragen
Inhaltsverzeichnis
Beschreibung
Mit der folgenden Powershell-Funktion lassen sich die erweiterten Dateieigenschaften auslesen wie man sie sich z.B. in den Eigenschaften einer Datei auf dem Tab Details anzeigen lassen kann.

Das können z.B. solche Dinge wie EXIF-Details, Bildbreite, Bildhöhe, Bitrate, etc sein. Die Funktion fügt diese Eigenschaften den Datei-Objekten in der Pipeline als zusätzliche Eigenschaften hinzu. Beispiele dazu findet ihr weiter unten.
Powershell-Funktion : Add-ExtendedFileProperties
<#
.SYNOPSIS
Fügt erweiterte Eigenschaften von Dateien an das Filesystem-Objekt in der Pipline hinzu
.DESCRIPTION
Extrahiert erweiterte Eigenschaften von Dateien wie z.B. Exif-Daten, Musik- bzw. Filmdetails
.EXAMPLE
Get-ChildItem "C:\Temp" -File -Filter *.jpg | Add-ExtendedFileProperties -PropertyExtended System.Image.BitDepth,System.Image.HorizontalSize,System.Image.VerticalSize | select-object Name,System.Image.Bitdepth,System.Image.HorizontalSize,System.Image.VerticalSize
Fügt nur die Eigenschaften für Farbtiefe, Breite und Höhe der Bilder als zusätzliche Eigenschaften den Objekten in der Pipline hinzu.
Verfügbare CanonicalNames für den Parameter "PropertyExtended" lassen sich hier nachschlagen:
=> https://learn.microsoft.com/en-us/windows/win32/properties/props
.PARAMETER PropertyExtended
Mit diesem Parameter geben sie eine Komma-Separierte Liste von Eigenschaften an welche sie erhalten möchten.
-PropertyExtended System.Image.HorizontalSize,System.Image.VerticalSize
#>
function Add-ExtendedFileProperties {
param(
[Parameter(mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)][Alias("Fullname")][string[]]$path,
[Parameter(mandatory=$true)][ValidateNotNullOrEmpty()][string[]]$PropertyExtended
)
begin {
$shellObject = New-Object -ComObject Shell.Application
}
process {
foreach($file in $path){
$fsitem = Get-Item -LiteralPath $file
if(!$fsitem.PsIsContainer){
$shellitem = $shellObject.NameSpace($fsitem.DirectoryName).ParseName($fsitem.Name)
foreach($prop in $PropertyExtended){
$fsitem | Add-Member -Membertype Noteproperty -Name $prop -Value $shellitem.ExtendedProperty($prop)
}
}
$fsitem
}
}
}
Parameter der Funktion
Parameter | Beschreibung |
---|---|
PropertyExtended | CanonicalNames oder GUIDs der zu extrahierenden erweiterten Eigenschaften werden in einer Komma-Separierten Liste angegeben. Verfügbare CanonicalNames für den Parameter "PropertyExtended" lassen sich hier nachschlagen => Windows Properties |
path | Pfad(e) von Dateien, entweder übergeben über die Pipeline mittels Get-ChildItem oder als String-Array |
Beispielhafte Anwendung
Erweiterte Eigenschaften einer Reihe von Dateien über die Pipeline ausgeben
Get-ChildItem "C:\Ordner" -File -Filter *.jpg | Add-ExtendedFileProperties -PropertyExtended System.Image.HorizontalSize,System.Image.VerticalSize | select-object FullName,System.Image.HorizontalSize,System.Image.VerticalSize
Erweiterte Eigenschaften einer/mehrerer Datei(en) mittels direkter Pfadangabe ausgeben
Add-ExtendedFileProperties -Path "D:\datei1.jpg","D:\datei2.jpg" -PropertyExtended System.Image.Dimension | select-object FullName,System.Image.Dimension
Die verfügbaren CanonicalNames lassen sich auf folgender Webseite sortiert nach Dateikategorie nachschlagen:
Windows Properties
Viel Spaß damit
Grüße @colinardo
Datum | Update |
---|---|
07.05.2025 | Funktion von der Abfrage mittels "GetDetailsOf" auf "ExtendedProperty" und der Angabe der CanonicalNames der Eigenschaften umgestellt. Damit sind die Abfragen sprachunabhängig und zuverlässiger. |
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 223082
Url: https://administrator.de/tutorial/erweiterte-dateieigenschaften-mit-powershell-funktion-abfragen-223082.html
Ausgedruckt am: 29.05.2025 um 01:05 Uhr
11 Kommentare
Neuester Kommentar
Hallo colinardo,
sehr schöne Funktion!
Vor ein paar Jahren hatte ich mich auch schon mal intensiver damit beschäftigt. Um eine bestimmte Eigenschaft auszulesen, hatte ich die ExtendedProperty Methode ausgegraben, bei der man mit dem Namen der Eigenschaft direkt den entsprechenden Wert zurück bekommt.
Scripting mit Shell-Objekten ist und bleibt aber ein Alptraum. Mit GetDetailsOf bekommst du die deutschen Bezeichnungen, ExtendedProperty musst man hingegen mit den englischen Bezeichnungen füttern. So zieht sich das durch die gesamte Arbeit mit Shell-Objekten.
Hast du eine Idee, wie man aus diesem multilingualen Mist irgend etwas brauchbares machen kann? Ich meine kann man das MUI für ein Script irgendwie ausschalten oder irgendwie festlegen mit welcher Sprache man arbeiten möchte?
Grüße
rubberman
sehr schöne Funktion!
Vor ein paar Jahren hatte ich mich auch schon mal intensiver damit beschäftigt. Um eine bestimmte Eigenschaft auszulesen, hatte ich die ExtendedProperty Methode ausgegraben, bei der man mit dem Namen der Eigenschaft direkt den entsprechenden Wert zurück bekommt.
Scripting mit Shell-Objekten ist und bleibt aber ein Alptraum. Mit GetDetailsOf bekommst du die deutschen Bezeichnungen, ExtendedProperty musst man hingegen mit den englischen Bezeichnungen füttern. So zieht sich das durch die gesamte Arbeit mit Shell-Objekten.
Hast du eine Idee, wie man aus diesem multilingualen Mist irgend etwas brauchbares machen kann? Ich meine kann man das MUI für ein Script irgendwie ausschalten oder irgendwie festlegen mit welcher Sprache man arbeiten möchte?
Grüße
rubberman
Hallo colinardo,
ja nee, eine Übersetzungstabelle würde ich auch nicht erstellen. Gibt's ja offensichtlich auch schon (wenn auch in anderer Form). Alles was man da selbst übersetzt und einbindet ist redundant, potenziell fehlerbehaftet und beim nächsten Windowsupdate vielleicht schon veraltet. Ich hatte nur gehofft, dass sich da eine Einstellung oder eine Methode findet ... nicht lebensnotwendig natürlich
Grüße
rubberman
ja nee, eine Übersetzungstabelle würde ich auch nicht erstellen. Gibt's ja offensichtlich auch schon (wenn auch in anderer Form). Alles was man da selbst übersetzt und einbindet ist redundant, potenziell fehlerbehaftet und beim nächsten Windowsupdate vielleicht schon veraltet. Ich hatte nur gehofft, dass sich da eine Einstellung oder eine Methode findet ... nicht lebensnotwendig natürlich
Grüße
rubberman
Hallo Uwe,
hab gerade mal in meiner Snippet Sammlung gestöbert. Das letzte mal dass ich mich damit beschäftigt hatte war 2016. Weder "formatID propID" noch "CanonicalName" ist da irgendwie dabei. Vermutlich war es einfach zu abwegig einfach einen String aus den IDs zu machen. Und den CanonicalName hatte ich wohl als Klasse/Namespace.Eigenschaft interpretiert und auch da nicht mal probiert als String zu übergeben.
Danke auf jeden Fall für das Update!
Grüße
Steffen
hab gerade mal in meiner Snippet Sammlung gestöbert. Das letzte mal dass ich mich damit beschäftigt hatte war 2016. Weder "formatID propID" noch "CanonicalName" ist da irgendwie dabei. Vermutlich war es einfach zu abwegig einfach einen String aus den IDs zu machen. Und den CanonicalName hatte ich wohl als Klasse/Namespace.Eigenschaft interpretiert und auch da nicht mal probiert als String zu übergeben.
Danke auf jeden Fall für das Update!
Grüße
Steffen
Hallo colinardo,
sehr schöne Funktion! Leider funktioniert die Pipe mit der Funktion bei mir nicht. Würde mir bei Videos enorm helfen.
Hab Win11 und folgendes probiert:
Set-PSBreakpoint -Script C:\Scripts\Scripts\Add-ExtendedFileProperties.ps1 -Variable fileItem
... ohne Reaktion
Bin bei Powershell noch ein Neuling - wie kann ich den Fehler finden?
LG GoSher
sehr schöne Funktion! Leider funktioniert die Pipe mit der Funktion bei mir nicht. Würde mir bei Videos enorm helfen.
Get-ChildItem "D:\Temp" | C:\Scripts\Add-ExtendedFileProperties.ps1 | select * Nichts passiert - auch keine Fehlermeldung.
Get-ChildItem "D:\Temp" | select * Funktioniert normal mit Anzeige der Dateien
Hab Win11 und folgendes probiert:
Set-PSBreakpoint -Script C:\Scripts\Scripts\Add-ExtendedFileProperties.ps1 -Variable fileItem
... ohne Reaktion
Bin bei Powershell noch ein Neuling - wie kann ich den Fehler finden?
LG GoSher
Hallo colinardo,
Vielen Dank. Mit Deinen Tipps habe ich die Funktion jetzt lauffähig bekommen.
Aber Windows überrascht mich wieder einmal. Die Attribute Breite, Höhe (oder Bildbreite, Bildhöhe, Height, Width) lassen sich bei z.B. *.jpg oder *.mp4 partout nicht anzeigen. Obwohl "Abmessungen" angezeigt wird:
Da ich in VB.Net die function GetDetailsOf() bereits nutze - dort bekomme ich Breite und Höhe aufgelistet. Auszug :
Ausgabe des o.g. VB.Net-Codes:
0=Name=herz_weich.jpg
1=Größe=23,2 KB
2=Elementtyp=IrfanView JPG File
3=Änderungsdatum=02.12.2005 21:32
4=Erstelldatum=06.05.2025 17:02
5=Letzter Zugriff=06.05.2025 17:02
6=Attribute=A
9=Erkannter Typ=Bild
...
31=Abmessungen=720 x 576
...
175=Horizontale Auflösung=150 dpi
176=Breite=720 Pixel
177=Vertikale Auflösung=150 dpi
178=Höhe=576 Pixel
190=Ordnername=Temp
191=Dateispeicherort=D:\Temp
...
Das passt auch zur Anzeige im Windows-Explorer s.u.
In deiner Komplett-Variante kommen Breite und Höhe bei meinen Dateien gar nicht vor. Versteh ich nicht.
Ausserdem: Sind GetDetailsOf() bei Powershell und VB.Net unter Windows nicht identisch?

Vielen Dank. Mit Deinen Tipps habe ich die Funktion jetzt lauffähig bekommen.
Aber Windows überrascht mich wieder einmal. Die Attribute Breite, Höhe (oder Bildbreite, Bildhöhe, Height, Width) lassen sich bei z.B. *.jpg oder *.mp4 partout nicht anzeigen. Obwohl "Abmessungen" angezeigt wird:
Get-ChildItem "D:\Temp\*.jpg" -File | Add-ExtendedFileProperties -PropertyExtended "Abmessungen","Breite" | select FullName,Abmessungen,Breite,LastAccessTime
FullName Abmessungen Breite LastAccessTime
-------- ----------- ------ --------------
D:\Temp\herz_weich.jpg 720 x 576 06.05.2025 17:02:00
Da ich in VB.Net die function GetDetailsOf() bereits nutze - dort bekomme ich Breite und Höhe aufgelistet. Auszug :
...
'Alle verfügbaren Tags in Textdatei eintragen
Dim objShell = CreateObject("shell.application")
Dim objFolder = objShell.Namespace(Path.GetDirectoryName(Datei))
If (objFolder IsNot Nothing) Then
Dim objFolderItem = objFolder.ParseName(Path.GetFileName(Datei))
If (objFolderItem IsNot Nothing) Then
' there are a varying number of entries depending on the OS
' 34 min, W7=290, W8=309 with some blanks
' this should get up to 310 non blank elements
Do
Wert = objFolder.GetDetailsOf(objFolderItem, I)
If String.IsNullOrEmpty(Wert) = False Then
Textzeile = "" & Str(I) & "=" & objFolder.GetDetailsOf(Nothing, I) & "=" & Wert
'Debug.Print(Textzeile)
file.WriteLine(Textzeile)
End If
I += 1
Loop Until I > 310
'Do Until String.IsNullOrEmpty(Wert) Or I > 310
'Loop
End If
End If
Ausgabe des o.g. VB.Net-Codes:
0=Name=herz_weich.jpg
1=Größe=23,2 KB
2=Elementtyp=IrfanView JPG File
3=Änderungsdatum=02.12.2005 21:32
4=Erstelldatum=06.05.2025 17:02
5=Letzter Zugriff=06.05.2025 17:02
6=Attribute=A
9=Erkannter Typ=Bild
...
31=Abmessungen=720 x 576
...
175=Horizontale Auflösung=150 dpi
176=Breite=720 Pixel
177=Vertikale Auflösung=150 dpi
178=Höhe=576 Pixel
190=Ordnername=Temp
191=Dateispeicherort=D:\Temp
...
Das passt auch zur Anzeige im Windows-Explorer s.u.
In deiner Komplett-Variante kommen Breite und Höhe bei meinen Dateien gar nicht vor. Versteh ich nicht.
Get-ChildItem "D:\Temp\*.jpg" -File | Add-ExtendedFileProperties | select *
Ausserdem: Sind GetDetailsOf() bei Powershell und VB.Net unter Windows nicht identisch?
