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:
Datei | |
.jpg | Beschreibung, 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:
0 | Name | D15A0663.JPG | regedit.exe | Photos (57).zip |
1 | Größe | 5,75 MB | 350 KB | 13,2 MB |
2 | Elementtyp | JPG-Datei | Anwendung | ZIP-komprimierter Ordner |
3 | Änderungsdatum | 22.07.2019 19:41 | 19.03.2019 05:45 | 27.07.2019 00:21 |
4 | Erstelldatum | 25.07.2019 23:05 | 19.03.2019 05:45 | 27.07.2019 00:21 |
5 | Letzter Zugriff | 25.07.2019 23:05 | 19.03.2019 05:45 | 27.07.2019 00:21 |
6 | Attribute | A | A | A |
9 | Erkannter Typ | Bild | Anwendung | Komprimiert |
10 | Besitzer | FRANZ-DIMOTION\ffiala | TrustedInstaller | FRANZ-DIMOTION\ffiala |
11 | Art | Bild | Programm | Ordner |
12 | Aufnahmedatum | ?22.?07.?2019 ??15:35 | ||
19 | Bewertung | Nicht bewertet | Nicht bewertet | Nicht bewertet |
20 | Autoren | Picasa | ||
25 | Copyright | © Microsoft Corporation. Alle Rechte vorbehalten. | ||
30 | Kameramodell | Canon EOS 7D Mark II | ||
31 | Abmessungen | ?5472 x 3648? | ||
32 | Kamerahersteller | Canon | ||
33 | Firma | Microsoft Corporation | ||
34 | Dateibeschreibung | Registrierungs-Editor | ||
42 | Programmname | Picasa | ||
57 | Gesamtgröße | 3,63 TB | 232 GB | 3,63 TB |
61 | Computer | FRANZ-DIMOTION (dieser PC) | FRANZ-DIMOTION (dieser PC) | FRANZ-DIMOTION (dieser PC) |
164 | Dateierweiterung | .JPG | .exe | .zip |
165 | Dateiname | D15A0663.JPG | regedit.exe | Photos (57).zip |
166 | Dateiversion | 10.0.18362.1 | ||
169 | Freier Speicherplatz | 945 GB | 19,8 GB | 945 GB |
174 | Bittiefe | 24 | ||
175 | Horizontale Auflösung | ?72 dpi | ||
176 | Breite | ?5472 Pixel | ||
177 | Vertikale Auflösung | ?72 dpi | ||
178 | Höhe | ?3648 Pixel | ||
187 | Freigegeben | Nein | Nein | Nein |
190 | Ordnername | test | Windows | Downloads |
191 | Ordnerpfad | S:\Desktop\test | C:\Windows | S:\Downloads |
192 | Ordner | test (S:\Desktop) | Windows (C:) | Downloads (S:) |
194 | Pfad | S:\Desktop\test\D15A0663.JPG | C:\Windows\regedit.exe | S:\Downloads\Photos (57).zip |
196 | Typ | JPG-Datei | Anwendung | ZIP-komprimierter Ordner |
199 | Sprache | Deutsch (Deutschland) | ||
202 | Verknüpfungsstatus | Nicht aufgelöst | Nicht aufgelöst | Nicht aufgelöst |
254 | Verwendeter Speicherplatz | ?74% | ?91% | ?74% |
255 | EXIF-Version | 0230 | ||
257 | Lichtwert | ?0 Schritt(e) | ||
258 | Belichtungsprogramm | Normal | ||
259 | Belichtungszeit | ?1/200 Sek. | ||
260 | Blendenzahl | F/5.6 | ||
261 | Blitzlichtmodus | Kein Blitz, obligatorisch | ||
262 | Brennweite | ?124 mm | ||
264 | ISO-Filmempfindlichkeit | ISO-160 | ||
269 | Messmodus | Mehrfeld | ||
272 | Programmmodus | Normales Programm | ||
275 | Weißausgleich | Automatisch | ||
294 | Freigegeben für | Jeder; Franz Fiala | ||
295 | Freigabestatus | Freigegeben | Nicht freigegeben | Privat |
296 | Verfügbar | Verfügbar | Verfügbar | |
297 | Produktname | Betriebssystem Microsoft® Windows® | ||
298 | Produktversion | 10.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
- https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/?view=powershell-6
- https://docs.microsoft.com/en-us/windows/win32/shell/shell-namespace
- https://docs.microsoft.com/en-us/windows/win32/shell/folder-getdetailsof
- https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/import-csv?view=powershell-6
- https://www.powershellmagazine.com/2015/04/13/pstip-use-shell-application-to-display-extended-file-attributes/
Franz war pensionierter HTL Lehrer (TGM), Präsident von ClubComputer, Herausgeber der Clubzeitung PCNEWS und betreute unser Clubtelefon und Internet Support. Er war leidenschaftlicher Rapid Wien Fan. Er ist leider Anfang Jänner 2024 nach langer schwerer Krankheit verstorben.
Neueste Kommentare