通过 Powershell 进行智能图像搜索

发布于 2024-09-03 20:40:18 字数 220 浏览 5 评论 0原文

我对按自定义属性搜索文件感兴趣。例如,我想查找具有特定尺寸的所有 JPEG 图像。 我怀疑

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

这与 System.Drawing 的使用有关。怎样才能做到呢? 提前致谢

I am interested in file searching by custom properties. For example, I want to find all JPEG-images with certain dimensions. Something looks like

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

I suspect it's about using of System.Drawing. How it can be done?
Thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夜雨飘雪 2024-09-10 20:40:18

这实际上很容易做到,而且您对 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)
        }
}

That's actually pretty easy to do and your gut feeling about System.Drawing was in fact correct:

Add-Type -Assembly System.Drawing

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

Save that as Get-Image.ps1 somewhere in your path and then you can use it.

Another option would be to add the following to your $profile:

Add-Type -Assembly System.Drawing

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

which works pretty much the same. Of course, add fancy things like documentation or so as you see fit.

You can then use it like so:

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

Note that you should dispose the objects created this way after using them.

Of course, you can add a custom Dimension property so you could filter for that:

function Get-Image {
    $input |
        ForEach-Object { [Drawing.Image]::FromFile($_) } |
        ForEach-Object {
            $_ | Add-Member -PassThru NoteProperty Dimension ('{0}x{1}' -f $_.Width,$_.Height)
        }
}
宛菡 2024-09-10 20:40:18

这是一种(几乎)单行的替代实现:

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 的更完整的解决方案

Here's an alternative implementation as a (almost) 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 }

If you are going to need to run this command more than once, I would recommend Johannes' more complete solution instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文