Lógica final da solução de trabalho
Este script leva em consideração o layout atual da estrutura do versioninfo e trabalha com um parâmetro extra (o 1 ou 2 próximo ao final) para a paridade da string de entrada.
$versioninfostate = 0
(Get-Content "hello.exe" -Encoding Unicode) -split {$_ -lt " "} | % { if ($versioninfostate -eq 1) { write-host $_ } if ($versioninfostate -gt 0) { $versioninfostate = $versioninfostate - 1} if ($_ -match "ProductHash$") { $versioninfostate = 2 }}
Desenvolvimento do caminho final da solução
- "The last command can get only some version strings but not others I know are there"
Use
Select *
to get additional properties not shown with justFormat-List
- "Obter todas as cadeias do VersionInfo de um arquivo .exe"
Pipe the exe over to
% {$_.VersionInfo}
to useForeach-Object
rather thanWhere-Object
with$_.VersionInfo
zeroing in on just its properties in one list/record set- "Não é possível resolver nomes de propriedades arbitrárias"
- "De acordo com sua última atualização, mostrando que você instalou um utilitário de terceiros recomendado por alguém em um comentário, esse software parece ser de 2010 e projetado especificamente para o Windows 7. Em qualquer caso, parece adicionar uma propriedade adicional chamada
ProductHash
como por sua última captura de tela de atualização. "
Use
Get-FileHash
and then explicitly get the hash value of the exe that way
Abaixo está alguma lógica do PowerShell que. . .
- Usa
%
em vez de?
para colocar o executável por Foreach-Object em vez deWhere-Object
- Usa
Select *
em vez deFormat-List
para garantir que o objeto da variável seja deSystem.Object
BaseType em vez de usarSystem.Array
comoFormat-List
- Define uma variável com o valor da propriedade explícita conforme você especifica na
VersionInfo
list - Usa Get-FileHash para obter o valor de hash exe
PowerShell
$t = get-childitem ".\executablename" | % {$_.VersionInfo} | Select *
$Hash = (Get-FileHash $Exe).Hash
$t.<Property>, $Hash
Exemplo de saída
Coolest - www.CoolTool.com
30E14E358DD76EC712CCC6B5FD1E79DDEAA653E682E968DA0229BE13BED2B991
Objeto da lista VersionInfo
PS C:\WINDOWS\system32> get-childitem ".\executablename" | % {$_.VersionInfo} | Select *
FileVersionRaw : 1.80.0.0
ProductVersionRaw : 1.80.0.0
Comments :
CompanyName : Coolest - www.CoolTool.com
FileBuildPart : 0
FileDescription : Program - Cool memory analyzer
FileMajorPart : 1
FileMinorPart : 80
FileName : C:\Users\User\Desktop\Coolio.exe
FilePrivatePart : 0
FileVersion : 1.80
InternalName : TooCool
IsDebug : False
IsPatched : False
IsPrivateBuild : False
IsPreRelease : False
IsSpecialBuild : False
Language : English (United States)
LegalCopyright : Copyright © 1985-2099 Michael Jordan
LegalTrademarks :
OriginalFilename : Coolio
PrivateBuild :
ProductBuildPart : 0
ProductMajorPart : 1
ProductMinorPart : 80
ProductName : TooCool
ProductPrivatePart : 0
ProductVersion : 1.80
SpecialBuild :
Pesquisar conteúdo da sequência binária
Observação: Assim como os comandos cygwin
cli string
, grep
e outros procuram o binário do arquivo para corresponder à string "ProductHash"
, você pode ler isto de comandos semelhantes do PowerShell também.
$Match = (Get-Content ".\executablename") -replace "'0", "" | % {if($_ -match "(ProductHash)") {$Matches[0]}}
$Line = (Get-Content ".\executablename") -replace "'0", "" | % {if($_ -match "(ProductHash)") {$_}} | % {if($_ -match "(ProductHash).*$") {$Matches[0]}}
$Line = $Line -replace "[\W]", "'r'n" | % {if($_ -match "(ProductHash).*\s") {$Matches[0]}}
$MisMatch = $Line.Replace($Match, "")
Write-Output "$Match': $MisMatch"
Example Output
ProductHash: Hello_World_abcdefgh2