2010-06-02 30 views
9

Tôi quan tâm đến việc tìm kiếm tệp theo thuộc tính tùy chỉnh. Ví dụ, tôi muốn tìm tất cả các hình ảnh JPEG với kích thước nhất định. Một cái gì đó trông giống nhưTìm kiếm hình ảnh thông minh qua Powershell

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

Tôi nghi ngờ về việc sử dụng System.Drawing. Làm thế nào nó có thể được thực hiện? Cảm ơn trước

Trả lời

12

Đó là thực sự khá dễ dàng để làm và ruột của bạn cảm giác về System.Drawing là trên thực tế chính xác:

Add-Type -Assembly System.Drawing 

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

Save rằng như Get-Image.ps1 đâu đó trong đường dẫn của bạn và sau đó bạn có thể sử dụng nó.

Một lựa chọn khác sẽ được thêm dòng sau vào $profile của bạn:

Add-Type -Assembly System.Drawing 

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

mà làm việc khá nhiều như nhau. Tất nhiên, thêm những thứ ưa thích như tài liệu hoặc để bạn thấy phù hợp.

Bạn có thể sau đó sử dụng nó như vậy:

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

Lưu ý rằng bạn nên xử lý các đối tượng được tạo ra theo cách này sau khi sử dụng chúng.

Tất nhiên, bạn có thể thêm một tùy chỉnh Dimension thuộc tính để bạn có thể lọc cho rằng:

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

Bạn sẽ lưu ý trong câu trả lời, hình ảnh sẽ được xử lý sau khi tác vụ kết thúc? Chỉ để giáo dục những người viết kịch bản khác. Phương pháp vứt bỏ thường bị bỏ qua ... – stej

+1

@stej: Eep, ok. Bất kỳ cách nào làm như vậy một cách chính xác hoặc tự động ngoại trừ việc gắn '% {$ _. Dispose()}' vào cuối đường dẫn? – Joey

+0

Tôi không nghĩ có cách nào tốt hơn là làm theo cách thủ công như bạn đề xuất. Hoặc đợi cho đến khi kết thúc phiên Posh. Tuy nhiên, tôi thường mở giao diện điều khiển Posh sau khi đăng nhập và đóng nó trước khi đăng xuất, do đó, đó không phải là lý tưởng. Hãy thử/Cuối cùng cũng có thể giúp ích, nhưng đó là chi phí cao. Tôi nghĩ rằng một lưu ý là đủ và để phần còn lại trên các độc giả;) – stej

3

Dưới đây là một thực hiện thay thế như một (hầu như) một 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 } 

Nếu bạn sẽ cần phải chạy lệnh này nhiều hơn một lần, tôi sẽ khuyên bạn nên Johannes' more complete solution thay thế.

Các vấn đề liên quan