É possível
Use uma combinação de PowerShell, IconsExtract e ConsoleImageComparison .
- Extraia todos os ícones de todos os arquivos EXE em uma determinada pasta e suas subpastas usando o IconsExtract
- Compare cada ícone extraído com o ícone de referência original usando o ConsoleImageComparison
Compara graficamente duas imagens e retorna uma porcentagem de quão alta é a diferença. - Por fim, classifique todos os resultados por porcentagem de diferença e salve-os em um CSV para ver as melhores correspondências primeiro
Exemplo de saída
Aqui eu procurei pelo antigo ícone do Opera. Vejo que há 3 arquivos contendo meu ícone porque eles têm uma diferença de 0% em nosso ícone de referência. Além do nome do ícone extraído, também obtive o caminho onde o arquivo de origem reside.
IconsExtract
Usamos-icons
diz ao programa para extrair apenas arquivos ICO e deixar de fora arquivos PNG ou de cursor.
iconsext.exe /save "source file" "save folder" [-icons] [-cursors] [-asico]
Nós extraímos todos os ícones para uma pasta temporária e fazemos uma iteração em cada ícone e os comparamos. Depois disso, esvaziamos a pasta temporária e extraímos o próximo arquivo EXE na mesma pasta temporária. Então, estamos fazendo muita criação e exclusão de arquivos pequenos.
Um problema é que ícones visualmente idênticos podem ter várias versões de tamanho (32x32 vs. 255x255) e nossa comparação detectará grandes diferenças. Esse é um problema para a ferramenta comparar o ImageMagick , por exemplo.
Outro problema são cabeçalhos de imagem diferentes. Mesmo se a extensão for ICO, o tipo de imagem real é identificado usando alguns bytes exclusivos do conteúdo do arquivo. Extensão e conteúdo podem ser diferentes. Este é um problema para GraphicsMagick , um fork do ImageMagick.
ConsoleImageComparison
Por sorte, depois de algumas horas, encontrei o ConsoleImageComparison no www.codeproject.com. Usamos a habilidade de linha de comando, mas também tem uma GUI.
ImageComparisonConsole.exe [image1 path] [image2 path]
PowerShell
Agoravemapartedifícil.Temosquejuntartodasessaspeças.JáquevocêestánoWindows,euprefirooPowerShell.ClaroquevocêpodeusarqualqueroutralinguagemdescriptcomooLinuxbashouoWindows,sevocêquiser
Porcomparação,vocêobtémumastringcomoDifferenceis80%
.UsamosopadrãoRegExem(?<=Differenceis)\d+
paraextrairovalornuméricoeadicioná-loaumarray.Apartirdaí,apenasordenamosoarrayeoenviamosparaumCSVdelimitadoportabulação.Nadaextravagante.
$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"
Como usar
- Faça o download de IconsExtract e ConsoleImageComparison e salve-os em uma pasta
- Abra um novo arquivo de texto, cole o código acima e salve-o como
SearchByIcon.ps1
na mesma pasta. Agora você deve ter três arquivos em uma pasta - Altere a variável
$folder
para sua pasta raiz, onde o script deve começar a pesquisar. Eu olho em todas as subpastas, mas apenas para arquivos EXE. Você pode mudar esse comportamento - Altere a variável
$icon
para seu ícone de referência, que deve ser pesquisado por - Clique com o botão direito do mouse em
SearchByIcon.ps1
e selecione Executar com o PowerShell . Dependendo de quantos arquivos EXE você possui, o programa leva um tempo para terminar
Isso é tudo. Divirta-se.
Recebi alguns erros de falta de memória do ConsoleImageComparison. Mas parece não afetar o resultado ou abortar o programa