Smart Image -Suche über PowerShell
-
23-10-2019 - |
Frage
Ich interessiere mich für Dateisuche nach benutzerdefinierten Eigenschaften. Zum Beispiel möchte ich alle JPEG-Images mit bestimmten Dimensionen finden. Etwas sieht aus
Get-ChildItem -Path C:\ -Filter *.jpg -Recursive | where-object { $_.Dimension -eq '1024x768' }
Ich vermute, es geht darum, das System zu verwenden. Wie kann es gemacht werden? Danke im Voraus
Lösung
Das ist eigentlich ziemlich einfach und Ihr Bauchgefühl über das System.Drawing war tatsächlich richtig:
Add-Type -Assembly System.Drawing
$input | ForEach-Object { [Drawing.Image]::FromFile($_) }
Speichern Sie das als Get-Image.ps1
Irgendwo in deinem Weg und dann kannst du es benutzen.
Eine andere Option wäre, Folgendes zu Ihrem hinzuzufügen $profile
:
Add-Type -Assembly System.Drawing
function Get-Image {
$input | ForEach-Object { [Drawing.Image]::FromFile($_) }
}
Was so ziemlich gleich funktioniert. Fügen Sie natürlich ausgefallene Dinge wie Dokumentation oder so hinzu, wie Sie es für richtig halten.
Sie können dann verwenden es ist so:
gci -inc *.jpg -rec | Get-Image | ? { $_.Width -eq 1024 -and $_.Height -eq 768 }
Beachten Sie, dass Sie die auf diese Weise erstellten Objekte entsorgen sollten, nachdem Sie sie verwendet haben.
Natürlich können Sie einen Brauch hinzufügen Dimension
Eigenschaft, damit Sie dafür filtern können:
function Get-Image {
$input |
ForEach-Object { [Drawing.Image]::FromFile($_) } |
ForEach-Object {
$_ | Add-Member -PassThru NoteProperty Dimension ('{0}x{1}' -f $_.Width,$_.Height)
}
}
Andere Tipps
Hier ist eine alternative Implementierung als (fast) Einzeiler:
Add-Type -Assembly System.Drawing
Get-ChildItem -Path C:\ -Filter *.jpg -Recursive | ForEach-Object { [System.Drawing.Image]::FromFile($_.FullName) } | Where-Object { $_.Width -eq 1024 -and $_.Height -eq 768 }
Wenn Sie diesen Befehl mehr als einmal ausführen müssen, würde ich empfehlen, Johannes 'vollständigere Lösung stattdessen.