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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top