我需要一个命令行工具来转储标准的Windows DLL版本信息,以便我可以通过bash脚本(Cygwin)处理它.
作为一名Java开发人员,我不太熟悉Microsoft开发工具(尽管我对Microsoft Visual Embedded C++ 4.0和Microsoft Visual Basic 6.0有一点经验).
适当的工具似乎是mt.exe,如SO所述.但是,我发现获得这个小应用程序的唯一机会是下载适用于Windows Server 2008和.NET Framework的Windows SDK的1.29 GB ISO .我无法相信这是唯一的方法.
我还在Internet上发现了一个名为PEView的小应用程序,但它显示的信息太多(在我的情况下无用)信息,它不是命令行应用程序.
捆绑在Cygwin中的标准objdump也可以转储有关DLL文件的一些信息,但我看不到转储DLL版本的选项.请注意,此工具(使用-p选项)转储的MajorImageVersion,MinorImageVersion和其他字段与自己的DLL版本无关.
关于该怎么做的任何替代方案?也许我错过了一些重要的objdump选项?mt.exe是我唯一的选择吗?如果是这种情况,是否可以将其与Windows SDK分开?
您可以使用PowerShell获取所需的信息.
(Get-Item C:\Path\To\MyFile.dll).VersionInfo
默认情况下,这将显示ProductVersion和FileVersion但是可以使用完整的VERSIONINFO.即返回评论
(Get-Item C:\Path\To\MyFile.dll).VersionInfo.Comments
使用Microsoft Sysinternals Sigcheck.此示例仅输出版本:
sigcheck -q -n foo.dll
解压缩的sigcheck.exe仅为228 KB.
您可以编写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
C:\>wmic datafile where name="C:\\Windows\\System32\\kernel32.dll" get version Version 6.1.7601.18229
或者你可以自己建造一个.打开VS,创建一个新的控制台应用程序.创建一个没有ATL或MFC支持的简单项目,保持选中stdafx选项但不检查'empty project'并将其命名为VersionInfo.
您将获得一个包含2个文件的简单项目:VersionInfo.cpp和VersionInfo.h
打开cpp文件并将以下内容粘贴到其中,然后进行编译.你将能够运行它,第一个参数是完整的文件名,它将根据Version资源块打印出"Product:5.6.7.8 File:1.2.3.4".如果没有版本资源,它将返回-1,否则返回0.
使用dll CRT编译为8k二进制文件,使用静态链接的所有内容编译为60k(在C++选项中设置,将"代码生成页面,运行时选项"更改为"/ MT")
HTH.
PS.如果您不想使用Visual Studio,它仍然可以使用任何c ++编译器进行编译(手指交叉),但您几乎肯定必须更改#pragma - 只需在链接器设置中指定lib,pragma的只是一个自动链接到该库的简写.
// VersionInfo.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include#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; }
您还可以查看filever.exe,它可以作为Windows XP SP2支持工具包的一部分下载 - 仅下载4.7MB.