PowerShell kann sehr gut mit dem Dateiverzeichnis umgehen und auch Details zu Dateien bekanntgeben.

Get-ChildItem C:\Windows 
Get-ItemProperty C:\Windows\regedit.exe
Get-ItemProperty C:\Windows\regedit.exe | Format-List

Die erste Zeile zeigt alle Dateien und Ordner im Verzeichnis C:\Windows, die zweite Zeile zeigt Details zur Datei regedit.exe, die dritte Zeile gibt alle Parameter in Form eine Liste aus. Die Ausgabe dieser drei Befehle ergibt:

PS C:\Users\EIZO> Get-ChildItem C:\Windows 
    Verzeichnis: C:\Windows
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       19.03.2019     05:52                addins
d-----       23.03.2019     04:21                appcompat
d-----       21.04.2018     08:52                Applian Director    
...
Verzeichnis: C:\Windows
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       19.03.2019     05:45         358400 regedit.exePS 

    Verzeichnis: C:\Windows
Name           : regedit.exe
Length         : 358400
                 Debug:            False
                 Patched:          False
                 PreRelease:       False
                 PrivateBuild:     False
                 SpecialBuild:     False
                 Language:         Deutsch (Deutschland)

Man erhält aber nur Informationen, die man im Rahmen von Verwaltungstätigkeiten benötigt.

Das Windows-Betriebssystem bietet aber weitergehende Informationen über eine Datei, die man über das Kontextmenü -> Eigenschaften -> Allgemein, Sicherheit, Details sehen kann. In den Details gibt es weitere Kategorien, die dann aber – je nach Dateityp – verschieden umfangreich ausfallen können:

.pdf Datei
.jpgBeschreibung, Ursprung, Bild, Kamera, Erweiterte Eigenschaften, GPS, Datei
.exe .zip Beschreibung

Wenn man nun diese Daten für sehr viele Ordner und Dateien erfassen muss, ist Programmierung angesagt. Gesucht ist also ein Programm, das in der Lage ist, diese Eigenschaften von Dateien anzuzeigen.

Ordner und Dateien werden in Objekten abgebildet; entweder in Objekten von Windows-COM oder des DotNet-Framework.

Seit Windows 3.1 ist das so genannte COM-Modell (Component Object Model) in Verwendung, mit dem Windows-Prozesse miteinander kommunizieren können. Es ist bereits objektorientiert. Wenn man daran geht, es zu benutzen, sieht man ihm auch sein Geburtsdatum 1992 an.

$objShell = New-Object -ComObject Shell.Application    
$objFolder = $objShell.NameSpace("s:\desktop\")    
$objFile = $objFolder.items().item("dreipunkte.jpg")  

Eine Variable in Powershell beginnt mit einem Dollarzeichen. Für eine universellere Sprache wäre das vielleicht eine zu starke Einschränkung aber bei dieser Skriptsprache erspart man dadurch ein zusätzliches Schlüsselwort. Außerdem sind dadurch bei Ausgaben unübersichtliche Stringverkettungen entbehrlich.

Um in Powershell mit Objekten des Dateisystems kommunizieren zu können, benötigt man zuerst das Com-Objekt Shell-Application. Ein Ordner-Objekt $objFolder entsteht durch die Methode NameSpace, der man den Speicherort S:\desktop bekanntgibt. Eine Datei aus diesem Ordner wird in Datei-Objekt $objFile abgebildet und mit der Eigenschaft item aus allen Unterlementen items() dieses Ordners .

Um nun ein bestimmtes Detail einer Datei zu erfragen, benützt man die Methode getDetailsOf() der Folder-Klasse. In diesen beiden Zeilen wird der Verkettungsoperator für Zeilen `angewendet.

$objFolder.getDetailsOf($objFile.items, 0) + ' : ' `
  + $objFolder.getDetailsOf($objFile, 0)  
$objFolder.getDetailsOf($objFile.items, 1)  + ' : ' ` 
  + $objFolder.getDetailsOf($objFile, 1)  

Diese Zeilen zeigen die Bezeichnung und den Wert der Eigenschaft mit dem Index 0 und 1. Man erhält:

Name : dreipunkte.jpg
Größe : 1,58 KB

Aber welche Indizes gibt es insgesamt? Und was bedeuten sie? Da ich keine Dokumentation darüber gefunden habe, gibt es nur den Weg, es für verschiedene Dateitypen auszuprobieren. Man formuliert daher eine Schleife, die in einem bestimmten Bereich alle Indizes ausprobiert und die zutreffenden (die mit einem Namen ausgestattet sind) ausgibt.

Wir ersetzen die fixen Indizes 0 und 1 durch eine Laufvariable $i. Es ist etwas unpraktisch, dass man bei diesem Objektmodell zwischen einschließendem Ordner und Datei unterscheiden muss. Wir schreiben daher die Funktion so, dass sie sich diese beiden Bestandteile selbst aus einem gegebenen Pfad ermittelt. Wir wählen zum Testen die Datei c:\windows\regedit.exe, die man auf jedem PC findet. Eine Funktion, die alle Eigenschaften einer Datei ausgibt, könnte etwa so ausschauen:

Function Get-FileProperties {
    Param([string]$Path)
    $TAB=[char]9
    if (!($Path.Contains("\"))) { return }
    if ($Path[$Path.Length-1] -eq "\") { return }
    $File = $Path.Substring($Path.LastIndexOf("\")+1);
    $Path = $Path.Substring(0,$Path.LastIndexOf("\"));
    $objShell = New-Object -ComObject Shell.Application
    $objFolder = $objShell.NameSpace($Path)
    $objFile = $objFolder.items().item($File)
    for ($ia=0; $i -le 1000; $i++) {
        $Value = $objFolder.getDetailsOf($objFile, $i)
        if ($Value) {
            $Name = $objFolder.getDetailsOf($objFolder.items, $i)
            "$i$TAB$Name$TAB$Value" 
        } 
    } 
}
Get-FileProperties -Path "c:\windows\regedit.exe" 

Die Funktion benötigt als Argument eine Pfadangabe zu einer Datei. Wenn der Pfad keinen Backslash \ enthält oder wenn dieser am Ende steht, wird die Funktion abgebrochen. Der Pfad wird zerteilt in $Path, dem Pfad zum einschließenden Verzeichnis und den $File, den Dateinamen. Die Schleife durchlauft 1000 Zahlen und gibt jene Eigenschaften aus, die einen Wert enthalten.

   0     Name                      regedit.exe
   1     Größe                     350 KB
   2     Elementtyp                Anwendung
   3     Änderungsdatum            19.03.2019 05:45
   4     Erstelldatum              19.03.2019 05:45
   5     Letzter Zugriff           19.03.2019 05:45
   6     Attribute                 A
   9     Erkannter Typ             Anwendung
  10     Besitzer                  TrustedInstaller
  11     Art                       Programm
  19     Bewertung                 Nicht bewertet
 196     Typ                       Anwendung
 199     Sprache                   Deutsch (Deutschland)
 202     Verknüpfungsstatus        Nicht aufgelöst
 254     Verwendeter Speicherplatz ‎91%
 295     Freigabestatus            Nicht freigegeben
 296                               Verfügbar
 297     Produktname               Betriebssystem Microsoft® Windows®
 298     Produktversion            10.0.18362.1

Wir wenden nun diese Funktion auf verschiedene Dateien an:

Get-FileProperties -Path "s:\desktop\test\D15A0663.JPG"
Get-FileProperties -Path "c:\windows\regedit.exe"
Get-FileProperties -Path "s:\downloads\Photos (57).zip" 

Danach wir die Ausgabe in eine Tabelle geschrieben:

0NameD15A0663.JPGregedit.exePhotos (57).zip
1Größe5,75 MB350 KB13,2 MB
2ElementtypJPG-DateiAnwendungZIP-komprimierter Ordner
3Änderungsdatum22.07.2019 19:4119.03.2019 05:4527.07.2019 00:21
4Erstelldatum25.07.2019 23:0519.03.2019 05:4527.07.2019 00:21
5Letzter Zugriff25.07.2019 23:0519.03.2019 05:4527.07.2019 00:21
6AttributeAAA
9Erkannter TypBildAnwendungKomprimiert
10BesitzerFRANZ-DIMOTION\ffialaTrustedInstallerFRANZ-DIMOTION\ffiala
11ArtBildProgrammOrdner
12Aufnahmedatum?22.?07.?2019 ??15:35
19BewertungNicht bewertetNicht bewertetNicht bewertet
20AutorenPicasa
25Copyright© Microsoft Corporation. Alle Rechte vorbehalten.
30KameramodellCanon EOS 7D Mark II
31Abmessungen?5472 x 3648?
32KameraherstellerCanon
33FirmaMicrosoft Corporation
34DateibeschreibungRegistrierungs-Editor
42ProgrammnamePicasa
57Gesamtgröße3,63 TB232 GB3,63 TB
61ComputerFRANZ-DIMOTION (dieser PC)FRANZ-DIMOTION (dieser PC)FRANZ-DIMOTION (dieser PC)
164Dateierweiterung.JPG.exe.zip
165DateinameD15A0663.JPGregedit.exePhotos (57).zip
166Dateiversion10.0.18362.1
169Freier Speicherplatz945 GB19,8 GB945 GB
174Bittiefe24
175Horizontale Auflösung?72 dpi
176Breite?5472 Pixel
177Vertikale Auflösung?72 dpi
178Höhe?3648 Pixel
187FreigegebenNeinNeinNein
190OrdnernametestWindowsDownloads
191OrdnerpfadS:\Desktop\testC:\WindowsS:\Downloads
192Ordnertest (S:\Desktop)Windows (C:)Downloads (S:)
194PfadS:\Desktop\test\D15A0663.JPGC:\Windows\regedit.exeS:\Downloads\Photos (57).zip
196TypJPG-DateiAnwendungZIP-komprimierter Ordner
199SpracheDeutsch (Deutschland)
202VerknüpfungsstatusNicht aufgelöstNicht aufgelöstNicht aufgelöst
254Verwendeter Speicherplatz?74%?91%?74%
255EXIF-Version0230
257Lichtwert?0 Schritt(e)
258BelichtungsprogrammNormal
259Belichtungszeit?1/200 Sek.
260BlendenzahlF/5.6
261BlitzlichtmodusKein Blitz, obligatorisch
262Brennweite?124 mm
264ISO-FilmempfindlichkeitISO-160
269MessmodusMehrfeld
272ProgrammmodusNormales Programm
275WeißausgleichAutomatisch
294Freigegeben fürJeder; Franz Fiala
295FreigabestatusFreigegebenNicht freigegebenPrivat
296VerfügbarVerfügbarVerfügbar
297ProduktnameBetriebssystem Microsoft® Windows®
298Produktversion10.0.18362.1

Man sieht, dass die verfügbaren Eigenschaften vom Dateityp abhängig sind, und dass Bilddateien viele Metadaten bekannt geben, die als EXIF-Daten bekannt sind. Allerdings sehen wir hier keineswegs alle dieser EXIF-Daten.

Hier wurde gezeigt, wie man mit Powershell und einem Windows COM-Objekt Datei-Eigenschaften anzeigen kann. Wir wir gesehen haben, funktioniert diese Methode für alle Dateitypen.

Für fotografische Zwecke ist das aber zu wenig. bei Bildern muss man ein dafür spezialisiertes Objekt aus dem DotNet-FrameWork verwenden.

Links

Franz Fiala

Präsident Clubcomputer / Herausgeber PCNEWS bei ClubComputer.at
Franz ist pensionierter HTL Lehrer (TGM), Präsident von ClubComputer, Herausgeber der Clubzeitung PCNEWS und betreut unser Clubtelefon und Internet Support. Er ist leidenschaftlicher Rapid Wien Fan.

Letzte Artikel von Franz Fiala (Alle anzeigen)