Kommandozeilen-Tool Windows-DLL-Version dump?
-
03-07-2019 - |
Frage
Ich brauche ein Kommandozeilen-Tool Standard-Windows-DLL-Version Info-Dump, damit ich es mit Hilfe eines Bash-Skript (Cygwin) verarbeiten kann.
Als Java-Entwickler Ich bin nicht sehr verwendet, um Microsoft-Entwicklungstools (obwohl ich ein wenig Erfahrung mit Microsoft Visual Embedded C ++ 4.0 und Microsoft habe Visual Basic 6.0).
Das entsprechende Werkzeug zu sein scheint mt.exe , wie < a href = "https://stackoverflow.com/questions/420852/reading-an-applications-manifest-file"> angegeben auf SO. Doch die einzige Möglichkeit, die ich gefunden habe diese kleine Anwendung zu erhalten, ist ein 1,29 GB ISO des Windows SDK für Windows Server 2008 und .NET Framework . Ich kann nicht glauben, dass dies der einzige Weg ist, es zu tun.
Ich habe auch ein wenig Anwendung auf dem Internet genannt PEView , aber es zeigt zu viel (und nutzlos in meinem Fall) Informationen und es ist keine Kommandozeilen-Anwendung.
Standard objdump innerhalb Cygwin gebündelt können auch einige Informationen über die DLL-Dateien Dump, aber ich kann siehe die Option nicht DLL-Version dump. Beachten Sie, dass MajorImageVersion, MinorImageVersion und andere von diesem Tool abgeladen Felder (mit Option -p) sind nicht auf eigene DLL-Version verwendet.
Jede Alternativen zu wissen, was zu tun? Vielleicht habe ich einige wichtige objdump Option? Ist Mt.exe meine einzige Wahl? Wenn dies der Fall ist, ist es möglich, aus dem Windows SDK separat zu bekommen?
Lösung
Sie können auch bei Filever.exe aussehen, die als Teil der Windows XP SP2-Supporttools Paket -. nur 4,7 MB Downloads:
Andere Tipps
Sie können Powershell verwenden, um die gewünschten Informationen zu erhalten.
(Get-Item C:\Path\To\MyFile.dll).VersionInfo
Standardmäßig wird diese Product und Fileversion anzeigen Aber die volle VERSION zur Verfügung. D. h Kommentare zurückzukehren
(Get-Item C:\Path\To\MyFile.dll).VersionInfo.Comments
Verwenden Sie Microsoft Sysinternals Sigcheck . Dieses Beispiel gibt nur die Version:
sigcheck -q -n foo.dll
Entpackte sigcheck.exe ist nur 228 KB.
Sie können einen VBScript-Skript schreiben, die Dateiversion Informationen zu erhalten:
VersionInfo.vbs
set args = WScript.Arguments
Set fso = CreateObject("Scripting.FileSystemObject")
WScript.Echo fso.GetFileVersion(args(0))
Wscript.Quit
Sie können diesen Anruf aus der Befehlszeile wie folgt:
cscript //nologo VersionInfo.vbs C:\Path\To\MyFile.dll
oder Sie können eine selbst bauen. Öffnen VS, erstellen Sie eine neue Konsolenanwendung. Erstellen Sie ein einfaches Projekt ohne ATL oder MFC-Unterstützung, lassen Sie die stdafx Option aktiviert, aber nicht überprüfen ‚leeres Projekt‘ und nennen es Version.
Sie werden ein einfaches Projekt mit 2-Dateien erhalten: VersionInfo.cpp und VersionInfo.h
, um die CPP-Datei öffnen und die folgenden in sie einfügen, dann kompilieren. Sie werden in der Lage sein, es zu laufen, erste Argument der vollständige Dateiname ist, wird es auszudrucken „Produkt: 5.6.7.8 Datei: 1.2.3.4“ auf der Basis der Version Ressourcenblock. Wenn es keine Versionsressource ist wird es -1 zurück, sonst 0.
Kompiliert auf einen 8k binären die DLL CRT verwenden, 60k mit allem, was statisch gelinkte (eingestellt in der C ++ Optionen, ändern Sie "Code-Generierung Seite, Runtime-Optionen" auf "/ MT")
HTH.
PS. Wenn Sie nicht Visual Studio verwenden möchten, wird es noch kompilieren jede C ++ Compiler (Daumen), aber Sie werden fast müssen sicherlich die Pragma ändern - nur, dass lib in den Linker-Einstellungen angeben stattdessen die Pragma des nur eine Abkürzung, um automatisch mit dieser Bibliothek verknüpft.
// 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;
}
C:\>wmic datafile where name="C:\\Windows\\System32\\kernel32.dll" get version
Version
6.1.7601.18229
Die listdlls Tools von Systernals könnte die Arbeit erledigen: http: // technet. microsoft.com/en-us/sysinternals/bb896656.aspx
listdlls -v -d mylib.dll
Diese Funktion gibt die ntfs Windows-Dateidetails für jede Datei mit Cygwin bash (Ist-r-Click-Eigenschaften-info) mit dem Begriff
Übergeben Sie die Dateien Pfad FINFO () können UNIX-Pfad, dos Pfad, relativ oder absolut sein. Die Datei in einen absoluten Pfad nichts umgewandelt wird, dann überprüft, um zu sehen, ob es in-fact eine regelmäßige / vorhandene Datei ist. Dann umgewandelt in einen absoluten Fenster Pfad und an „wmic“. Dann Magie haben Sie Fenster Details direkt im Terminal-Datei. Verwendet: Cygwin, cygpath, sed und awk. Benötigt Windows-WMI „wmic.exe“ in Betrieb ist. Der Ausgang ist für die einfache korrigiert ...
$ 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" }'
}
Mit Powershell ist es möglich, nur die Version String zu erhalten, das heißt 2.3.4 von jedem DLL oder EXE mit dem folgenden Befehl
(Get-Item "C:\program files\OpenVPN\bin\openvpn.exe").VersionInfo.ProductVersion
Getestet unter Windows 10
Es gibt eine Kommandozeilen-Anwendung „ShowVer“ bei Codeproject genannt:
ShowVer.exe Befehlszeilenversionanzeigeprogramm
Wie üblich die Anwendung kommt mit einer exe und dem Quellcode (VisualC ++ 6).
Out-Ausgänge all Meta-Daten zur Verfügung:
Auf einem deutschen Win7 System der Ausgang für user32.dll ist wie folgt:
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
und ein Weg mit makecab
:
; @echo off
;;goto :end_help
;;setlocal DsiableDelayedExpansion
;;;
;;;
;;; fileinf /l list of full file paths separated with ;
;;; fileinf /f text file with a list of files to be processed ( one on each line )
;;; fileinf /? prints the help
;;;
;;:end_help
; REM Creating a Newline variable (the two blank lines are required!)
; set NLM=^
; set NL=^^^%NLM%%NLM%^%NLM%%NLM%
; if "%~1" equ "/?" type "%~f0" | find ";;;" | find /v "find" && exit /b 0
; if "%~2" equ "" type "%~f0" | find ";;;" | find /v "find" && exit /b 0
; setlocal enableDelayedExpansion
; if "%~1" equ "/l" (
; set "_files=%~2"
; echo !_files:;=%NL%!>"%TEMP%\file.paths"
; set _process_file="%TEMP%\file.paths"
; goto :get_info
; )
; if "%~1" equ "/f" if exist "%~2" (
; set _process_file="%~2"
; goto :get_info
; )
; echo incorect parameters & exit /b 1
; :get_info
; set "file_info="
; makecab /d InfFileName=%TEMP%\file.inf /d "DiskDirectory1=%TEMP%" /f "%~f0" /f %_process_file% /v0>nul
; for /f "usebackq skip=4 delims=" %%f in ("%TEMP%\file.inf") do (
; set "file_info=%%f"
; echo !file_info:,=%nl%!
; )
; endlocal
;endlocal
; del /q /f %TEMP%\file.inf 2>nul
; del /q /f %TEMP%\file.path 2>nul
; exit /b 0
.set DoNotCopyFiles=on
.set DestinationDir=;
.set RptFileName=nul
.set InfFooter=;
.set InfHeader=;
.Set ChecksumWidth=8
.Set InfDiskLineFormat=;
.Set Cabinet=off
.Set Compress=off
.Set GenerateInf=ON
.Set InfDiskHeader=;
.Set InfFileHeader=;
.set InfCabinetHeader=;
.Set InfFileLineFormat=",file:*file*,date:*date*,size:*size*,csum:*csum*,time:*time*,vern:*ver*,vers:*vers*,lang:*lang*"
Beispiel Ausgabe (es hat eine String-Version, die eine kleine Ergänzung zu wmic Methode ist :)):
c:> fileinfo.bat /l C:\install.exe
file:install.exe
date:11/07/07
size:562688
csum:380ef239
time:07:03:18a
vern:9.0.21022.8
vers:9.0.21022.8 built by: RTM
lang:1033
und eine weitere Verwendung von Shell.Application und Hybrid Batch \ jscript.Here tooptipInfo.bat :
@if (@X)==(@Y) @end /* JScript comment
@echo off
rem :: the first argument is the script name as it will be used for proper help message
cscript //E:JScript //nologo "%~f0" %*
exit /b %errorlevel%
@if (@X)==(@Y) @end JScript comment */
//////
FSOObj = new ActiveXObject("Scripting.FileSystemObject");
var ARGS = WScript.Arguments;
if (ARGS.Length < 1 ) {
WScript.Echo("No file passed");
WScript.Quit(1);
}
var filename=ARGS.Item(0);
var objShell=new ActiveXObject("Shell.Application");
/////
//fso
ExistsItem = function (path) {
return FSOObj.FolderExists(path)||FSOObj.FileExists(path);
}
getFullPath = function (path) {
return FSOObj.GetAbsolutePathName(path);
}
//
//paths
getParent = function(path){
var splitted=path.split("\\");
var result="";
for (var s=0;s<splitted.length-1;s++){
if (s==0) {
result=splitted[s];
} else {
result=result+"\\"+splitted[s];
}
}
return result;
}
getName = function(path){
var splitted=path.split("\\");
return splitted[splitted.length-1];
}
//
function main(){
if (!ExistsItem(filename)) {
WScript.Echo(filename + " does not exist");
WScript.Quit(2);
}
var fullFilename=getFullPath(filename);
var namespace=getParent(fullFilename);
var name=getName(fullFilename);
var objFolder=objShell.NameSpace(namespace);
var objItem=objFolder.ParseName(name);
//https://msdn.microsoft.com/en-us/library/windows/desktop/bb787870(v=vs.85).aspx
WScript.Echo(fullFilename + " : ");
WScript.Echo(objFolder.GetDetailsOf(objItem,-1));
}
main();
verwendet, um gegen cmd.exe:
C:\Windows\System32\cmd.exe :
File description: Windows Command Processor
Company: Microsoft Corporation
File version: 6.3.9600.16384
Date created: ?22-?Aug-?13 ??13:03
Size: 347 KB