我有一个 EXE 文件,其中有一个关联的图标。我想在多个系统中搜索同一个图标。
每个系统上的 EXE 名称可能不同(它是一个 12 个字符长的随机字符串)。但图标似乎保持不变。
我该如何搜索具有此特定图标的所有文件?
答案1
这是可能的
使用 PowerShell 组合,图标提取和控制台图像比较。
- 使用 IconsExtract 从给定文件夹及其子文件夹中的所有 EXE 文件中提取所有图标
- 使用 ConsoleImageComparison 将每个提取的图标与原始参考图标进行比较,
它以图形方式比较两个图像并返回差异的百分比。 - 最后,按差异百分比对所有结果进行排序,并将其保存为 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"
如何使用
- 下载图标提取和控制台图像比较并保存到文件夹中
- 打开一个新的文本文件,粘贴上面的代码并将其保存到
SearchByIcon.ps1
同一文件夹中。现在您应该在一个文件夹中有三个文件 - 将变量更改
$folder
为脚本应开始搜索的根文件夹。我会查找所有子文件夹,但只查找 EXE 文件。您可以更改此行为 - 将变量更改
$icon
为要搜索的参考图标 - 右键单击
SearchByIcon.ps1
并选择使用 PowerShell 运行。根据您拥有的 EXE 文件数量,程序需要一段时间才能完成
就这样吧。玩得开心。
我从 ConsoleImageComparison 中得到了一些内存不足错误。但它似乎不会影响结果或中止程序