2010-06-02 69 views
9

我感興趣的文件按自定義屬性搜索。例如,我想要查找具有特定尺寸的所有JPEG圖像。東西看起來像智能圖像搜索通過Powershell

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

我懷疑這是關於使用System.Drawing。如何做到這一點? 在此先感謝

回答

12

這實際上是很容易做到,你的直覺約System.Drawing中,其實是正確的:

Add-Type -Assembly System.Drawing 

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

保存,作爲Get-Image.ps1某處你的路徑,然後你可以使用它。

另一種選擇是添加以下到您的$profile

Add-Type -Assembly System.Drawing 

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

其工作原理幾乎相同。當然,如果您認爲合適的話,請添加文檔等花哨的東西。

然後,您可以使用像這樣:

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

請注意,您應使用後丟棄這種方式創建的對象。

當然,你可以添加自定義Dimension屬性,所以你可以爲過濾:

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

你會在答案中注意到圖像應該在任務完成後丟棄嗎?只是爲了教育其他腳本。處置方法經常被忽略... – stej 2010-06-02 14:12:22

+1

@stej:Eep,好的。除了將'%{$ _。Dispose()}'附加到管道末端之外,可以正確或自動執行此操作的任何方式? – Joey 2010-06-02 14:53:12

+0

我認爲沒有比您建議的手動更好的方法。 或等到Posh會話結束。但是,我通常在登錄後打開Posh控制檯,並在註銷之前將其關閉,因此這並不理想。 嘗試/最後也可以幫助,但這是開銷。我認爲一張紙條就足夠了,讓讀者休息一下;) – stej 2010-06-02 15:57:17

3

這裏有一個替代的實施爲(幾乎)的一行:

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 } 

如果您需要不止一次運行這個命令,我會推薦使用Johannes' more complete solution