До Windows 10 можно было получить все строки VersionInfo
, щелкнув правой кнопкой мыши файл и выполнив свойства. Это больше не работает. Как будто кто-то решил показать только те, которые приобрели стандартное значение за десятилетия. Но GUI не имеет значения, за исключением того, что он не работает, поэтому вызовы COM на страницу свойств не помогут. В любом случае мы хотим узнать, как из командной строки.
Пытался:
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
Третья команда может получить только некоторые строки версии, но не те, которые, как я знаю, есть.
Это похоже на то, как теперь все способы знают "стандартный" список (есть два или три представления о том, что такое стандартный список), и никто из них не знает, как перечислить все строки VersionInfo. У меня есть двоичный файл со строкой "ProductHash", которая является хешем git commit соответствующего исходного кода, используемого для его компиляции.
Я продолжаю получать ответы, предложенные с участием {$_.VersionInfo}
. Этот путь никогда не сработает, потому что VersionInfo
верит в фиксированный список свойств versioninfo для извлечения. Компилятор rc
и структура PE VERSIONINFO
верят по-разному. И wmic имеет другой фиксированный список, который он получает.
Это собственность. Он появился только после применения расширения оболочки VersInfoEx от Fish, связанного с помощью postanote.
Фрагмент исходного кода (ресурс Windows):
#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
Мне удалось получить по-настоящему ужасный и неудовлетворительный ответ, который ничего не знает о VERSIONINFO и читает в мегабайтах файла и зависит от слишком большого количества устанавливаемых файлов.
cmd> c:\cygwin64\bin\tr -d \0 < filename.exe | c:\cygwin64\bin\strings | c:\cygwin64\bin\grep ^^ProductHash. | c:\cygwin64\bin\sed s/ProductHash//
Это работает при условии, что искомое имя строки VERSIONINFO не находится где-то еще в двоичном файле. Я надеюсь, что плохого ответа достаточно, чтобы лучше объяснить вопрос.
Попытка сделать то же самое с PowerShell, как это было предложено Pimp Juice IT, не сработала:
PS> Get-Content ".\executablename.exe" | % { if($_ -match "ProductHash") { write-host $_}}
PS>
Это было достаточно близко к рабочей идее, и я смог определить, почему она не дала результатов. Я вставил tr
cygwin обратно в конвейер, и выполнение команды заняло так много времени, что я подумал, что оно зависло, но в итоге я получил какой-то вывод.
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>
Я сделал минимальный двоичный файл hello.zip (1313 байт, распаковывает до 4096 байт). Ключ информации о версии "ProductHash" имеет значение "Hello_World_abcdefgh".
Не обманывайтесь. ProductHash не является хешем двоичного файла. Это хэш-ключ в хранилище исходного кода, чтобы найти исходный код, из которого был скомпилирован бинарный файл. Идея в том, что если кто-то получит какую-то странную версию, мы можем отследить ее и точно определить, какой код у них есть. Вместо того чтобы заказчик отправлял нам большой файл, мы бы отправили ему небольшую команду, чтобы извлечь из него значение.