Инструмент командной строки для вывода версии Windows DLL? - PullRequest
62 голосов
/ 02 марта 2009

Мне нужен инструмент командной строки для вывода стандартной информации о версии Windows DLL, чтобы я мог обработать ее с помощью сценария bash (Cygwin).

Как разработчик Java, я не очень привык к инструментам разработки Microsoft (хотя у меня есть небольшой опыт работы с Microsoft Visual Embedded C ++ 4.0 и Microsoft Visual Basic 6.0).

Подходящим инструментом является mt.exe , как указано в SO . Однако единственный шанс получить это маленькое приложение - это загрузить ISO-файл Windows SDK для Windows Server 2008 и .NET Framework на 1,29 ГБ. Я не могу поверить, что это единственный способ сделать это.

Я также нашел в Интернете небольшое приложение под названием PEView , но оно отображает слишком много (и бесполезно в моем случае) информации и не является приложением командной строки.

Стандартный objdump , встроенный в Cygwin, также может выводить некоторую информацию о файлах DLL, но я не вижу опции для вывода версии DLL. Обратите внимание, что MajorImageVersion, MinorImageVersion и другие поля, сбрасываемые этим инструментом (с параметром -p), не связаны с собственной версией DLL.

Любые альтернативы о том, что делать? Может быть, я пропустил какой-то важный параметр objdump? Является ли mt.exe моим единственным выбором? Если это так, возможно ли получить его отдельно от Windows SDK?

Ответы [ 11 ]

99 голосов
/ 29 октября 2012

Вы можете использовать PowerShell для получения необходимой информации.

(Get-Item C:\Path\To\MyFile.dll).VersionInfo

По умолчанию это будет отображать ProductVersion и FileVersion Но полная версия VERSIONINFO доступна. То есть вернуть Комментарии

(Get-Item C:\Path\To\MyFile.dll).VersionInfo.Comments
58 голосов
/ 04 ноября 2009

Использование Microsoft Sysinternals Sigcheck . В этом примере выводится только версия:

sigcheck -q -n foo.dll

Размер распакованного sigcheck.exe составляет всего 228 КБ.

46 голосов
/ 03 марта 2009

Вы можете написать скрипт VBScript для получения информации о версии файла:

VersionInfo.vbs

set args = WScript.Arguments
Set fso = CreateObject("Scripting.FileSystemObject")
WScript.Echo fso.GetFileVersion(args(0))
Wscript.Quit

Вы можете вызвать это из командной строки так:

cscript //nologo VersionInfo.vbs C:\Path\To\MyFile.dll
10 голосов
/ 04 декабря 2013
C:\>wmic datafile where name="C:\\Windows\\System32\\kernel32.dll" get version
Version
6.1.7601.18229
10 голосов
/ 03 марта 2009

или вы можете построить его самостоятельно. Откройте VS, создайте новое консольное приложение. Создайте простой проект без поддержки ATL или MFC, оставьте опцию stdafx отмеченной, но не проверяйте «пустой проект» и называйте его VersionInfo.

Вы получите простой проект с 2 файлами: VersionInfo.cpp и VersionInfo.h

Откройте файл cpp и вставьте в него следующее, затем скомпилируйте. Вы сможете запустить его, первым аргументом будет полное имя файла, он выведет "Product: 5.6.7.8 Файл: 1.2.3.4" на основе блока ресурсов Version. Если нет ресурса версии, он вернет -1, иначе 0.

Компилируется в двоичный файл 8 КБ с использованием DLL CRT, 60 КБ со всем, что связано статически (установите в параметрах C ++, измените «Страница генерации кода, Параметры времени выполнения» на «/ MT»)

НТН.

PS. Если вы не хотите использовать Visual Studio, он все равно будет компилироваться с использованием любого компилятора c ++ (скрестив пальцы), но вам почти наверняка придется изменить #pragma - просто укажите этот lib в настройках компоновщика, вместо прагмы. просто сокращение для автоматической связи с этой библиотекой.


// VersionInfo.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>

#pragma comment(lib, "version.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    DWORD handle = 0;
    DWORD size = GetFileVersionInfoSize(argv[1], &handle);
    BYTE* versionInfo = new BYTE[size];
    if (!GetFileVersionInfo(argv[1], handle, size, versionInfo))
    {
        delete[] versionInfo;
        return -1;
    }
    // we have version information
    UINT    len = 0;
    VS_FIXEDFILEINFO*   vsfi = NULL;
    VerQueryValue(versionInfo, L"\\", (void**)&vsfi, &len);

    WORD fVersion[4], pVersion[4];
    fVersion[0] = HIWORD(vsfi->dwFileVersionMS);
    fVersion[1] = LOWORD(vsfi->dwFileVersionMS);
    fVersion[2] = HIWORD(vsfi->dwFileVersionLS);
    fVersion[3] = LOWORD(vsfi->dwFileVersionLS);
    pVersion[0] = HIWORD(vsfi->dwProductVersionMS);
    pVersion[1] = LOWORD(vsfi->dwProductVersionMS);
    pVersion[2] = HIWORD(vsfi->dwProductVersionLS);
    pVersion[3] = LOWORD(vsfi->dwProductVersionLS);

    printf("Product: %d.%d.%d.%d File: %d.%d.%d.%d\n", 
        pVersion[0], pVersion[1], 
        pVersion[2], pVersion[3], 
        fVersion[0], fVersion[1], 
        fVersion[2], fVersion[3]);
    delete[] versionInfo;

    return 0;
}
10 голосов
/ 02 марта 2009

Вы также можете посмотреть файл filever.exe, который можно загрузить как часть пакета средств поддержки Windows XP SP2 - загрузка только 4,7 МБ.

3 голосов
/ 07 июня 2018

Используя Powershell, можно получить только строку Version, то есть 2.3.4, из любой dll или exe с помощью следующей команды

(Get-Item "C:\program files\OpenVPN\bin\openvpn.exe").VersionInfo.ProductVersion

Проверено на Windows 10

3 голосов
/ 02 января 2014

Эта функция возвращает сведения о файле Windows NTFS для любого файла, использующего Cygwin bash (фактическая информация о r-click-свойствах), в выражение

Передать путь к файлу в finfo (), может быть путь unix, путь dos, относительный или абсолютный. Файл преобразуется в абсолютный путь nix, затем проверяется, является ли он на самом деле обычным / существующим файлом. Затем преобразуется в абсолютный путь Windows и отправляется в «wmic». Тогда волшебство, у вас есть данные файла Windows прямо в терминале. Использование: cygwin, cygpath, sed и awk. Требуется Windows WMI "wmic.exe" для работы. Вывод корректируется для простоты ...

$ finfo notepad.exe
$ finfo "C:\windows\system32\notepad.exe" 
$ finfo /cygdrive/c/Windows/System32/notepad.exe 
$ finfo "/cygdrive/c/Program Files/notepad.exe"
$ finfo ../notepad.exe

finfo() {
    [[ -e "$(cygpath -wa "$@")" ]] || { echo "bad-file"; return 1; }
    echo "$(wmic datafile where name=\""$(echo "$(cygpath -wa "$@")" | sed 's/\\/\\\\/g')"\" get /value)" |\
    sed 's/\r//g;s/^M$//;/^$/d' | awk -F"=" '{print $1"=""\033[1m"$2"\033[0m" }'
}
3 голосов
/ 12 декабря 2012

Инструменты listdll от Systernals могут выполнять эту работу: http://technet.microsoft.com/en-us/sysinternals/bb896656.aspx

listdlls -v -d mylib.dll
1 голос
/ 12 сентября 2011

В CodeProject есть приложение командной строки под названием «ShowVer»:

Программа отображения VERSIONINFO из командной строки ShowVer.exe

Как обычно, приложение поставляется с exe и исходным кодом (VisualC ++ 6).

Out выводит все доступные метаданные:

В немецкой системе Win7 вывод для user32.dll выглядит следующим образом:

VERSIONINFO for file "C:\Windows\system32\user32.dll":  (type:0)
  Signature:       feef04bd
  StrucVersion:    1.0
  FileVersion:     6.1.7601.17514
  ProductVersion:  6.1.7601.17514
  FileFlagsMask:   0x3f
  FileFlags:       0
  FileOS:          VOS_NT_WINDOWS32
  FileType:        VFT_DLL
  FileDate:        0.0
 LangID: 040704B0
  CompanyName       : Microsoft Corporation
  FileDescription   : Multi-User Windows USER API Client DLL
  FileVersion       : 6.1.7601.17514 (win7sp1_rtm.101119-1850)
  InternalName      : user32
  LegalCopyright    : ® Microsoft Corporation. Alle Rechte vorbehalten.
  OriginalFilename  : user32
  ProductName       : Betriebssystem Microsoft« Windows«
  ProductVersion    : 6.1.7601.17514
 Translation: 040704b0
...