2010-06-02 14 views
9

Sono interessato alla ricerca di file per proprietà personalizzate. Ad esempio, voglio trovare tutte le immagini JPEG con determinate dimensioni. Qualcosa sembraRicerca immagine intelligente tramite PowerShell

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

Ho il sospetto che si tratta di utilizzare System.Drawing. Come può essere fatto? Grazie in anticipo

risposta

12

Che in realtà è abbastanza facile da fare e il vostro istinto su System.Drawing era in realtà corretto:

Add-Type -Assembly System.Drawing 

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

Salva che, come Get-Image.ps1 qualche parte nel vostro percorso e quindi è possibile utilizzarlo.

Un'altra opzione sarebbe quella di aggiungere quanto segue al $profile:

Add-Type -Assembly System.Drawing 

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

che funziona più o meno lo stesso. Ovviamente, aggiungi cose fantastiche come la documentazione o come ritieni opportuno.

È quindi possibile uso in questo modo:

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

Si noti che è necessario disporre gli oggetti creati in questo modo dopo il loro utilizzo.

Naturalmente, è possibile aggiungere una personalizzato Dimension proprietà così si potrebbe filtrare per questo:

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

Nella risposta si noterà che l'immagine deve essere eliminata al termine dell'attività? Solo per educare altri sceneggiatori. Il metodo di smaltimento è spesso trascurato ... – stej

+1

@stej: Eep, ok. Qualunque modo di farlo in modo corretto o automatico eccetto il collegamento di '% {$ _. Dispose()}' alla fine della pipeline? – Joey

+0

Non penso che ci sia un modo migliore di farlo manualmente come si propone. Oppure attendere fino alla fine della sessione Posh. Tuttavia, in genere apro la console Posh dopo aver effettuato il login e chiuso prima di disconnessione, quindi non è l'ideale. Provare/Infine potrebbe aiutare pure, ma quello è sovraccarico. Penso che una nota sia sufficiente e lasci il resto ai lettori;) – stej

3

Ecco un'implementazione alternativa come (quasi) one-liner:

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 } 

Se avremo bisogno di eseguire questo comando più di una volta, vorrei raccomandare invece Johannes' more complete solution.