这是可能的

这是可能的

我有一个 EXE 文件,其中有一个关联的图标。我想在多个系统中搜索同一个图标。

每个系统上的 EXE 名称可能不同(它是一个 12 个字符长的随机字符串)。但图标似乎保持不变。

我该如何搜索具有此特定图标的所有文件?

答案1

这是可能的

使用 PowerShell 组合,图标提取控制台图像比较

  1. 使用 IconsExtract 从给定文件夹及其子文件夹中的所有 EXE 文件中提取所有图标
  2. 使用 ConsoleImageComparison 将每个提取的图标与原始参考图标进行比较,
    它以图形方式比较两个图像并返回差异的百分比。
  3. 最后,按差异百分比对所有结果进行排序,并将其保存为 CSV,以便首先查看最佳匹配

示例输出

在这里我搜索了旧的 Opera 图标。我发现有 3 个文件包含我的图标,因为它们与我们的参考图标的差异为 0%。除了提取的图标名称外,我还获得了源文件所在的路径。

在此处输入图片描述

图标提取

我们使用 Nirsoft 的图标提取扫描给定文件并提取每个可能的图标。请记住,单个 EXE 或 DLL 中可以有多个图标。该-icons开关指示程序仅提取 ICO 文件并忽略 PNG 或光标文件。

iconsext.exe /save "source file" "save folder" [-icons] [-cursors] [-asico]

我们将所有图标提取到临时文件夹中,然后遍历每个图标并进行比较。之后,我们清空临时文件夹,并将下一个 EXE 文件提取到同一个临时文件夹中。因此,我们创建和删除了很多小文件。

一个问题是,视觉上相同的图标可以有多个尺寸版本(32x32 与 255x255),我们的比较会发现巨大的差异。这对于ImageMagick 的比较工具为例。

另一个问题是不同的图像标头。即使扩展名是 ICO,实际图像类型也是使用文件内容中的一些唯一字节来识别的。扩展名和内容可能不同。对于图形魔法,来自 ImageMagick 的一个分支。

控制台图像比较

幸运的是,几个小时后我在 www.codeproject.com 上找到了 ConsoleImageComparison。我们使用命令行功能,但它也有一个 GUI。

ImageComparisonConsole.exe [image1 path] [image2 path] 

在此处输入图片描述

电源外壳

现在到了最难的部分。我们必须把所有这些部分放在一起。由于您使用的是 Windows,我更喜欢 PowerShell。当然,如果您愿意,您可以使用任何其他脚本语言,如 Linux bash 或 Windows 批处理

每次比较,您都会得到一个类似 的字符串Difference is 80%。我们使用 RegEx 模式
(?<=Difference is )\d+提取数值并将其添加到数组中。然后我们只需对数组进行排序并将其输出到制表符分隔的 CSV 中。没什么特别的。

$folder       = "D:\Browser\Internet\Browser"
$icon         = "C:\Users\Nixda\Desktop\Opera.ico"  
$scriptFolder = Split-Path $MyInvocation.MyCommand.Path
$iconExt      = "$scriptFolder\iconsext.exe"
$CIC          = "$scriptFolder\ConsoleImageComparison.exe"

$results = @()
get-childitem -path $folder -recurse -include @("*.exe") | foreach {

    & $iconExt /save $_.Fullname "$scriptFolder\temp" -icons |out-null
    $file =  $_.fullname

    get-childitem -path "$scriptFolder\temp" | foreach {

        $percent = & $CIC $icon $_.Fullname | 
          Select-String '(?<=Difference is )\d+' | 
          % { $_.Matches } | % { $_.Value }        

        $results += ,@([int]$percent, $_.Name, $file)
    }    

    remove-item "$scriptFolder\temp" -recurse | out-null
}
$results | sort-object @{Expression={$_[0]}; Ascending=$true} | 
  % { $_ -join "`t" } | 
  out-File "$scriptFolder\result.csv"

& "$scriptFolder\result.csv"  

如何使用

  1. 下载图标提取控制台图像比较并保存到文件夹中
  2. 打开一个新的文本文件,粘贴上面的代码并将其保存到SearchByIcon.ps1同一文件夹中。现在您应该在一个文件夹中有三个文件
  3. 将变量更改$folder为脚本应开始搜索的根文件夹。我会查找所有子文件夹,但只查找 EXE 文件。您可以更改此行为
  4. 将变量更改$icon为要搜索的参考图标
  5. 右键单击SearchByIcon.ps1并选择使用 PowerShell 运行。根据您拥有的 EXE 文件数量,程序需要一段时间才能完成

就这样吧。玩得开心。

我从 ConsoleImageComparison 中得到了一些内存不足错误。但它似乎不会影响结果或中止程序

相关内容