Erweiterte Dateieigenschaften mit Powershell-Funktion abfragen
Inhaltsverzeichnis
Beschreibung
Folgende Powershell-Funktion extrahiert die Erweiterten Dateieigenschaften wie man sie 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
function Add-ExtendedFileProperties{
<#
.SYNOPSIS
Fügt erweiterte Eigenschaften von Dateien an das Objekt in der Pipline hinzu
.DESCRIPTION
Extrahiert erweiterte Eigenschaften von Dateien wie z.B. Exif-Daten, Musik- bzw. Filmdetails
.EXAMPLE
Get-ChildItem "C:\Temp" | Add-ExtendedFileProperties -PropertyExtended "Bildhöhe","Bildbreite","Datenrate" | ft Name,Bildhöhe,Bildbreite,Datenrate
Fügt alle nur die Eigenschaften "Bildhöhe","Bildbreite","Datenrate" als zusätzliche Spalten dem Objekt in der Pipline hinzu
.EXAMPLE
Get-ChildItem "C:\Temp" | Add-ExtendedFileProperties | fl *
Fügt alle verfügbaren erweiterten Eigenschaften dem Objekt in der Pipline hinzu
.PARAMETER PropertyExtended
Mit diesem Parameter geben sie eine Komma-Separierte Liste von Eigenschaften an welche sie erhalten möchten.
-PropertyExtended "Bildhöhe","Bildbreite","Bitrate"
#>
param(
[Parameter(Mandatory=$true,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
$fileItem,
[String[]] $PropertyExtended = "ALL"
)
begin
{
$shellObject = New-Object -Com Shell.Application
$itemProperties = $null
}
process
{
if($fileItem.PsIsContainer)
{
$fileItem
return
}
$directoryName = $fileItem.DirectoryName
$filename = $fileItem.Name
$folderObject = $shellObject.NameSpace($directoryName)
$item = $folderObject.ParseName($filename)
if(-not $itemProperties)
{
$itemProperties = @{}
$counter = 0
$columnName = ""
if ($PropertyExtended -eq "ALL"){
#get all properties
do {
$columnName = $folderObject.GetDetailsOf($folderObject.Items, $counter)
if($columnName) { $itemProperties[$counter] = $columnName }
$counter++
}while($columnName)
}else{
#get user defined properties
do {
$columnName = $folderObject.GetDetailsOf($folderObject.Items, $counter)
foreach($name in $PropertyExtended){
if ($columnName.toLower() -eq $name.toLower()){
$itemProperties[$counter] = $columnName
}
}
$counter++
}while($columnName)
}
}
foreach($itemProperty in $itemProperties.Keys)
{
$fileItem | Add-Member NoteProperty $itemProperties[$itemProperty] `
$folderObject.GetDetailsOf($item, $itemProperty) -ErrorAction `
SilentlyContinue
}
$fileItem
}
}
Parameter der Funktion
Parameter | Beschreibung |
---|---|
-PropertyExtended | [Optional] Namen der zu extrahierenden erweiterten Eigenschaften werden in einer Komma-Separierten Liste angegeben(bsp: "Bildhöhe","Bildbreite") |
Beispielhafte Anwendung
Beispiel 1: Alle verfügbaren Erweiterten Dateieigenschaften von Dateien ausgeben
Get-ChildItem "C:\Ordner" | Add-ExtendedFileProperties | select *
Beispiel 2: Nur bestimmte Eigenschaften von Dateien ausgeben
Get-ChildItem "C:\Ordner" | Add-ExtendedFileProperties -PropertyExtended "Bildhöhe","Bildbreite" | select FullName,Bildhöhe,Bildbreite
Hinweise
Man sollte wenn möglich immer die zu extrahierenden Eigenschaften mit angeben, weil dies den Vorgang erheblich beschleunigt wenn nicht alle Eigenschaften extrahiert werden müssen.Viel Spaß damit
Grüße @colinardo
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 223082
Url: https://administrator.de/contentid/223082
Ausgedruckt am: 23.11.2024 um 08:11 Uhr
5 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