Smart Image Search через PowerShell
-
23-10-2019 - |
Вопрос
Я заинтересован в поиске файлов по пользовательским свойствам. Например, я хочу найти все изображения JPEG с определенными измерениями. Что -то выглядит
Get-ChildItem -Path C:\ -Filter *.jpg -Recursive | where-object { $_.Dimension -eq '1024x768' }
Я подозреваю, что речь идет об использовании 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)
}
}
Другие советы
Вот альтернативная реализация в качестве (почти) одной линии:
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 }
Если вам понадобится запустить эту команду более одного раза, я бы порекомендовал Более полное решение Йоханнеса вместо.