2010-06-02 6 views
9

Ich bin interessiert an Dateisuche nach benutzerdefinierten Eigenschaften. Ich möchte zum Beispiel alle JPEG-Bilder mit bestimmten Abmessungen finden. Etwas sieht aus wieSmart Bildsuche über Powershell

Get-ChildItem -Path C:\ -Filter *.jpg -Recursive | where-object { $_.Dimension -eq '1024x768' } 

Ich vermute, es ist über die Verwendung von System.Drawing. Wie kann es gemacht werden? Vielen Dank im Voraus

Antwort

12

Das ist eigentlich ziemlich einfach zu tun und Ihr Darm über System.Drawing Gefühl war in der Tat richtig:

Add-Type -Assembly System.Drawing 

$input | ForEach-Object { [Drawing.Image]::FromFile($_) } 

speichern, die als Get-Image.ps1 irgendwo in Ihrem Weg und dann können Sie es verwenden.

Eine andere Möglichkeit wäre Folgendes zu Ihrer $profile hinzuzufügen:

Add-Type -Assembly System.Drawing 

function Get-Image { 
    $input | ForEach-Object { [Drawing.Image]::FromFile($_) } 
} 

, die so ziemlich das gleiche funktioniert. Fügen Sie natürlich tolle Dinge wie Dokumentation hinzu oder so, wie Sie es für richtig halten.

Sie können dann Verwendung es etwa so:

gci -inc *.jpg -rec | Get-Image | ? { $_.Width -eq 1024 -and $_.Height -eq 768 } 

Beachten Sie, dass die Objekte auf diese Weise entsorgt werden nach der Verwendung von ihnen erstellt.

Natürlich können Sie eine benutzerdefinierte Dimension Eigenschaft hinzufügen, so dass Sie für diesen Filter könnte:

function Get-Image { 
    $input | 
     ForEach-Object { [Drawing.Image]::FromFile($_) } | 
     ForEach-Object { 
      $_ | Add-Member -PassThru NoteProperty Dimension ('{0}x{1}' -f $_.Width,$_.Height) 
     } 
} 
+1

Sie werden Sie in der Antwort darauf hinweisen, dass das Bild nach Abschluss der Aufgabe entsorgt werden sollte? Nur um andere Scripter zu erziehen. Dispose-Methode wird oft übersehen ... – stej

+1

@stej: Eep, ok. Irgendeine Möglichkeit, dies richtig oder automatisch zu tun, außer dass% _ $ _. Dispose()} an das Ende der Pipeline angehängt wird? – Joey

+0

Ich glaube nicht, dass es einen besseren Weg gibt, als es manuell zu tun, wie Sie es vorschlagen. Oder warten Sie bis zum Ende der Posh-Sitzung. Allerdings öffne ich normalerweise die Posh-Konsole, nachdem ich mich angemeldet habe, und schließe sie, bevor ich mich abmelde, das ist also nicht ideal. Versuchen/Schließlich könnte auch helfen, aber das ist Overhead. Ich denke eine Note ist genug und lass den Rest auf die Leser;) – stej

3

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 müssen diesen Befehl mehr als einmal ausführen, ich würde stattdessen Johannes' more complete solution empfehlen.