Wie bekomme ich alle VersionInfo-Zeichenfolgen aus einer EXE-Datei an der Windows-Eingabeaufforderung?

907
Joshua

Vor Windows 10 können Sie alle VersionInfoZeichenfolgen abrufen, indem Sie mit der rechten Maustaste auf eine Datei klicken und Eigenschaften festlegen. Das geht nicht mehr. Es ist, als würde sich jemand dafür entscheiden, nur diejenigen zu zeigen, die im Laufe der Jahrzehnte eine Standardbedeutung erlangt haben. Die GUI spielt jedoch keine Rolle, außer dass sie nicht funktioniert, sodass COM-Aufrufe der Eigenschaftsseite nicht helfen. Wir wollen sowieso von der Kommandozeile wissen.

Versucht:

PS> get-childitem .\execautablename | FormatList VersionInfo PS> (get-item .\execautablename | format-list -force) PS> get-childitem .\execautablename | ? {$_.VersionInfo.Xyz} cmd> wmic datafile where Name="C:\\Full\\Path\\to\\executablename.exe" list full 

Der dritte Befehl kann nur einige Versionszeichenfolgen erhalten, andere jedoch nicht.

Es ist, als würden alle Möglichkeiten jetzt eine "Standard" -Liste kennen (es gibt zwei oder drei Ideen, was die Standardliste ist), und keine von ihnen kann alle VersionInfo-Strings mehr auflisten. Ich habe eine Binärdatei mit der Zeichenfolge "ProductHash", bei der es sich um den git commit-Hash des entsprechenden Quellcodes handelt, der zum Kompilieren verwendet wird.

Ich bekomme immer wieder Antworten vorgeschlagen {$_.VersionInfo}. Dieser Pfad wird nie funktionieren, weil er VersionInfoan eine feste Liste von versioninfo-Eigenschaften glaubt, die abgerufen werden sollen. Der rcCompiler und die VERSIONINFOPE-Struktur glauben unterschiedlich. Und wmic hat eine andere feste Liste, die es abruft.

versioninfo after applying VersInfoEx

Dies ist die Eigenschaft. Es zeigte sich erst gar bis nach Fisch Anwendung VersInfoEx Shell - Erweiterung durch verknüpft postanote .

Quellausschnitt ( Windows-Ressource ):

#include <windows.h>  1 VERSIONINFO FILEVERSION 10, 0, 0, 0 PRODUCTVERSION 10, 0, 0, 0 FILEFLAGSMASK 0 FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" BEGIN VALUE "FileDescription", "Hello RC" VALUE "FileVersion", "10.0.0.0" VALUE "LegalCopyright", "Copyright (C) Cedaron Medical, Inc. 2018" VALUE "InternalName", "hellorc" VALUE "ProductHash", "Hello_World_abcdefgh" /* this is the value I'm after */ VALUE "ProductName", "Hello RC" VALUE "ProductVersion", "10.0.0.0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END 

Es ist mir gelungen, eine wirklich schreckliche und unbefriedigende Antwort zu erhalten, die nichts über VERSIONINFO weiß und Megabytes von Dateien einliest und von zu viel Installation abhängt.

cmd> c:\cygwin64\bin\tr -d \0 < filename.exe | c:\cygwin64\bin\strings | c:\cygwin64\bin\grep ^^ProductHash. | c:\cygwin64\bin\sed s/ProductHash// 

Dies funktioniert, vorausgesetzt, der Name der VERSIONINFO-Zeichenfolge, nach der gesucht wird, befindet sich auch nicht an anderer Stelle in der Binärdatei. Ich hoffe, dass eine schlechte Antwort ausreicht, um die Frage besser zu erklären.

Der Versuch, mit Powershell dasselbe zu tun, wie von Pimp Juice IT vorgeschlagen, hat nicht ganz funktioniert:

PS> Get-Content ".\executablename.exe" | % { if($_ -match "ProductHash") { write-host $_}} PS> 

Es war nahe genug an einer Arbeitsidee, dass ich feststellen konnte, warum sie keinen Output lieferte. Ich steckte Cygwins trzurück in die Pipeline und der Befehl dauerte so lange, dass ich dachte, er hätte hängen bleiben, aber schließlich bekam ich etwas Output.

PS> Get-Content ".\executablename.exe" | c:\cygwin64\bin\tr.exe -d \0 | % { if($_ -match "ProductHash") { write-host $_}} InternalNameexecutablenameh$ProductNameMyProductPProductVersion10.0.591.927r)ProductHash50acd7cedb99dddab69c5de9b2f021ef72d64ca0DVarFileInfo$Translation ????<?xml version="1.0" encoding="UTF-8" standalone="yes"?> PS> 

Ich habe ein minimales binäres Hallo.zip (1313 Byte, dekomprimiert auf 4096 Byte) erstellt. Der Versionsinfo-Schlüssel "ProductHash" hat den Wert "Hello_World_abcdefgh".

Lass dich nicht täuschen. ProductHash ist kein Hash der Binärdatei. Es ist ein Hash-Schlüssel im Quellcode-Repository, um den Quellcode zu finden, aus dem die Binärdatei kompiliert wurde. Die Idee ist, wenn jemand mit einer seltsamen Version endet, können wir sie aufspüren und genau feststellen, welchen Code sie haben. Anstatt dass der Kunde uns eine große Datei sendet, schicken wir ihnen lieber einen kleinen Befehl, um den Wert herauszufinden.

1

2 Antworten auf die Frage

3
Pimp Juice IT

Letzte Arbeitslösungslogik

Dieses Skript berücksichtigt das tatsächliche Layout der versioninfo-Struktur und arbeitet mit einem zusätzlichen Parameter (der 1 oder 2 nahe dem Ende) für die Parität der Eingabezeichenfolge.

$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 }} 

Entwicklung des Final Solution Path

  1. "Der letzte Befehl kann nur einige Versionszeichenfolgen erhalten, andere jedoch nicht."
    • Verwenden Sie Select *diese Option, um zusätzliche Eigenschaften zu erhalten, die nicht mit angezeigt werdenFormat-List

  2. "Holen Sie sich alle VersionInfo-Strings aus einer EXE-Datei"
    • Rohr der exe über zu % {$_.VersionInfo}verwenden, Foreach-Objectanstatt Where-Objectmit $_.VersionInfo Einschießen auf nur seine Eigenschaften in einer Liste / Datensatz

  3. Msgstr "Kann nicht beliebige Eigenschaftsnamen auflösen"
    • Tatsächlich können Sie die # 1 & # 2 wie oben angegeben verwenden (siehe unten).

  4. „Wie pro Ihre letzte Änderung zeigt Sie einen Dritten Dienstprogramm installiert von jemandem Sie in einem Kommentar zu empfehlen, dass die Software aus dem Jahr 2010 zu sein scheint und die speziell für Windows 7. In jedem Fall entworfen, so scheint es, eine zusätzliche Eigenschaft hinzufügen namens ProductHashper Ihr letzter Update-Screenshot. "
    • Verwenden Sie Get-FileHash und erhalten Sie dann explizit den Hashwert des Exes auf diese Weise


Nachfolgend finden Sie eine PowerShell-Logik. . .

  • Verwendet %statt ?die ausführbare Datei durch setzen Foreach-Object stattWhere-Object
  • Verwendet Select *statt Format-Listum sicherzustellen, dass das Variablenobjekt einen System.Object Basis-Typ hat und nicht ein System.Arrayas Format-Listerstellt
  • Legt eine Variable mit dem expliziten Eigenschaftswert fest, wie Sie sie in der VersionInfoListe angeben
  • Verwendet Get-FileHash, um den Exe-Hashwert abzurufen

Power Shell

$t = get-childitem ".\executablename" | % {$_.VersionInfo} | Select * $Hash = (Get-FileHash $Exe).Hash $t.<Property>, $Hash 

Ausgabebeispiel

Coolest - www.CoolTool.com 30E14E358DD76EC712CCC6B5FD1E79DDEAA653E682E968DA0229BE13BED2B991 

VersionInfo-Listenobjekt

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 :  

Binären String-Inhalt durchsuchen

Hinweis: So wie die cygwincli string, grepund andere Befehle, um die binäre der Datei suchen die Zeichenfolge übereinstimmen "ProductHash", können Sie dies aus ähnlichen Powershell - Befehle als auch lesen.

$Match = (Get-Content ".\executablename") -replace "`0", "" | % } $Line = (Get-Content ".\executablename") -replace "`0", "" | % } | % }  $Line = $Line -replace "[\W]", "`r`n" | % } $MisMatch = $Line.Replace($Match, "") Write-Output "$Match`: $MisMatch" 

Beispielausgabe

ProductHash: Hello_World_abcdefgh2 

Weitere Ressourcen

1
postanote

Ich habe dies nur für eine ausführbare Datei gemacht und die Versionsinformationen auf der Registerkarte "Details" angezeigt. Also, ich bin irgendwie verloren, was Sie damit meinen.

Dieser PS-Ansatz ist auch hier dokumentiert:

https://blogs.technet.microsoft.com/askpfeplat/2014/12/07/how-to-correctly-check-dateiversionen-mit-powershell

Auf meinem Win10-Client

 (Get-CimInstance -CimInstance Win32_OperatingSystem).Caption Microsoft Windows 10 Pro  $PSVersionTable  Name Value  ---- -----  PSVersion 5.1.17134.228  PSEdition Desktop  PSCompatibleVersions  BuildVersion 10.0.17134.228  CLRVersion 4.0.30319.42000  WSManStackVersion 3.0  PSRemotingProtocolVersion 2.3  SerializationVersion 1.1.0.1     (Get-Item -Path 'F:\Downloads\WindowsAzureADRightsManagementAdministration_x64.exe').VersionInfo | Format-List -Force    OriginalFilename : setup.exe FileDescription : Software Installer ProductName : Windows Azure AD Rights Management Administration Comments :  CompanyName : Microsoft Corporation FileName : F:\Downloads\WindowsAzureADRightsManagementAdministration_x64.exe FileVersion : 1.0.594.1 ProductVersion : 1.0.594.1 IsDebug : False IsPatched : False IsPreRelease : False IsPrivateBuild : False IsSpecialBuild : False Language : English (United States) LegalCopyright : Copyright (c) Microsoft Corporation. All rights reserved. LegalTrademarks : Microsoft and Windows are either registered trademarks or trademarks of Microsoft Corporation in the U.S. and/or other countries. PrivateBuild : ************************************** SpecialBuild :  FileVersionRaw : 1.0.594.1 ProductVersionRaw : 1.0.594.1 
Das ist das gleiche (get-item. \ Execautablename | format-list -force), von dem ich schon sagte, dass es nicht funktioniert. Es gibt VersionInfo-Eigenschaften, die in der Windows 7-Benutzeroberfläche angezeigt werden und nicht angezeigt werden. Joshua vor 5 Jahren 0
Ich denke, wir verstehen das alle, aber Sie haben nicht angegeben, nach welchen Eigenschaften Sie streben, die Sie nicht bekommen. Ich habe keine Altsysteme zur Verfügung und hatte diese seit Jahren nicht mehr. Wir können jedoch alle diese Informationen auf älteren Codeseiten wie https://www.codeproject.com/articles/118909/windows-file-properties-version-tab-shell-extens sehen. Wie bereits erwähnt, wird dieses Zeug vom Betriebssystem zurückgegeben. Wenn das Betriebssystem es nicht zur Verfügung stellt, kann es nicht abgerufen werden, ohne den oben genannten Link-Sample-Ansatz möglicherweise zu durchlaufen. postanote vor 5 Jahren 0
Letzter Satz: "Ich habe eine Binärdatei mit der Zeichenfolge" ProductHash "" Joshua vor 5 Jahren 0
Nun, diese Codeprojekt-Shell-Erweiterung funktioniert auf Maschinen, auf denen eine vollständige GUI installiert ist (kein Server-Core). Es zeigt alle Eigenschaften. Joshua vor 5 Jahren 0
OK, aber dein Beitrag sagte Win10, nicht Server-Core. Jetzt habe ich zurzeit keinen Server-Core in meinen Laboren, also keine Möglichkeit, dies zu überprüfen, und keine Dateien, die wie die zu überprüfenden Daten sind. Wenn Sie alles gesagt haben, verwenden Sie einfach die unformatierte WMIC für den Dateinamen und sehen Sie, was Sie zurückbekommen. Wenn es nicht da ist, dann ist es ein Haken bei den aktuellen OS-Versionen, soweit ich das bisher validieren kann. Beispiel: Wmic-Datendatei wobei Name = "D: \\ Temp \\ AADRMS.exe" vollständige Liste enthält postanote vor 5 Jahren 1
Wir diskutieren derzeit, ob eine GUI-Lösung gut genug ist. Die Frage sagte nicht Server-Kern, sondern Befehlszeile. Joshua vor 5 Jahren 0