2009-03-02 27 views
53

मुझे मानक विंडोज डीएलएल संस्करण जानकारी डंप करने के लिए एक कमांड लाइन उपकरण की आवश्यकता है ताकि मैं इसे एक बैश स्क्रिप्ट (सिगविन) के माध्यम से संसाधित कर सकूं।विंडोज डीएलएल संस्करण डंप करने के लिए कमांड लाइन उपकरण?

एक जावा डेवलपर मैं बहुत माइक्रोसॉफ्ट विकास उपकरण के लिए इस्तेमाल नहीं कर रहा हूँ के रूप में (हालांकि मैं माइक्रोसॉफ्ट के साथ अनुभव का एक छोटा सा है दृश्य एंबेडेड सी ++ 4.0 और माइक्रोसॉफ्ट विजुअल बेसिक 6.0)।

उपयुक्त उपकरण, mt.exe होने की stated on SO के रूप में लगता है। हालांकि इस छोटे से आवेदन को पाने का एकमात्र मौका Windows SDK for Windows Server 2008 and .NET Framework का 1.2 9 जीबी आईएसओ डाउनलोड करना है। मुझे विश्वास नहीं है कि यह करने का यही एकमात्र तरीका है।

मुझे PEView नामक इंटरनेट पर थोड़ा सा एप्लिकेशन भी मिला है, लेकिन यह बहुत अधिक (और मेरे मामले में बेकार) जानकारी प्रदर्शित करता है और यह कमांड लाइन एप्लिकेशन नहीं है।

मानक objdump सिग्विन के अंदर बंडल डीएलएल फ़ाइलों के बारे में कुछ जानकारी भी डंप कर सकता है, लेकिन मैं डीएलएल संस्करण को डंप करने का विकल्प नहीं देख सकता। ध्यान दें कि MajorImageVersion, MinorImageVersion और इस टूल द्वारा छोड़े गए अन्य फ़ील्ड (-पी विकल्प के साथ) अपने डीएलएल संस्करण से संबंधित नहीं हैं।

क्या करना है इसके बारे में कोई विकल्प? शायद मैं कुछ महत्वपूर्ण objdump विकल्प याद किया? क्या mt.exe मेरी एकमात्र पसंद है? यदि ऐसा है, तो क्या इसे विंडोज एसडीके से अलग करना संभव है?

उत्तर

9

आप filever.exe को भी देख सकते हैं, जिसे Windows XP SP2 Support Tools पैकेज के हिस्से के रूप में डाउनलोड किया जा सकता है - केवल 4.7 एमबी डाउनलोड (या सीधे here से)।

+2

जो केवल फ़ाइल संस्करण सूचीबद्ध करता है, अन्य संस्करण पहलुओं को नहीं। अक्सर आपको उत्पाद संस्करण की भी आवश्यकता होती है। 'sigcheck' (uvts_cvs उल्लेख के रूप में) उनको भी दिखाता है, और यह बहुत छोटा डाउनलोड है। –

45

आप फ़ाइल संस्करण जानकारी पाने के लिए एक 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 
+0

कमांड लाइन स्क्रिप्ट के माध्यम से व्यवहार्य लगता है। धन्यवाद –

10

या आप स्वयं को बना सकते हैं। ओपन वीएस, एक नया कंसोल आवेदन बनाएँ। कोई एटीएल या एमएफसी समर्थन के साथ एक साधारण परियोजना बनाएं, stdafx विकल्प को चेक करें लेकिन 'खाली प्रोजेक्ट' की जांच न करें और इसे VersionInfo पर कॉल करें।

आप 2 फाइलों के साथ एक सरल परियोजना मिल जाएगा: VersionInfo.cpp और VersionInfo.h

ओपन cpp फ़ाइल और इसे में निम्नलिखित पेस्ट, तो संकलन। आप इसे चलाने में सक्षम होंगे, पहला तर्क पूर्ण फ़ाइल नाम है, यह "उत्पाद: 5.6.7.8 फ़ाइल: 1.2.3.4" संस्करण संसाधन ब्लॉक के आधार पर प्रिंट करेगा। यदि कोई संस्करण संसाधन नहीं है तो यह -1 लौटाएगा, अन्यथा 0.

डीएल सीआरटी का उपयोग करके 8k बाइनरी में संकलित, 60k स्थिर रूप से जुड़े सब कुछ के साथ संकलित (सी ++ विकल्पों में सेट, बदलें "कोड जनरेशन पेज, रनटाइम विकल्प" "/ एमटी")

एचटीएच।

पीएस। यदि आप विजुअल स्टूडियो का उपयोग नहीं करना चाहते हैं, तो यह अभी भी किसी भी सी ++ कंपाइलर (अंगुलियों को पार कर) का उपयोग करके संकलित करेगा, लेकिन आपको लगभग निश्चित रूप से #pragma को बदलना होगा - बस उस लिंक को लिंकर सेटिंग्स में निर्दिष्ट करें, प्रज्ञा उस लाइब्रेरी से स्वचालित रूप से लिंक करने के लिए बस एक शॉर्टेंड।


// 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; 
} 
+0

बिल्कुल वही नहीं जो मैं खोज रहा था, लेकिन इसे करने के लिए एक छोटा प्रोग्राम विकसित करना अभी भी दिलचस्प है। धन्यवाद। –

+1

नहीं? आप किस संस्करण की जानकारी चाहते थे? AFAIK विंडोज़ में केवल संसाधन ब्लॉक में संग्रहीत संस्करण जानकारी है - जब आप एक्सप्लोरर में गुण खोलते हैं तो ये वही होते हैं। – gbjbaanb

+1

ब्रावो! मैं भी विकासशील पहियों का आनंद लेता हूं :) – divinci

55

उपयोग Microsoft Sysinternals Sigcheck। यह नमूना आउटपुट सिर्फ संस्करण:

sigcheck -q -n foo.dll 

पैक नहीं किया गया sigcheck.exe केवल 228 KB है।

+3

349 KB पांच साल बाद ... अभी भी इसके लायक है? ;) – Ben

1

वहाँ एक कमांड लाइन आवेदन CodeProject पर "ShowVer" कहा जाता है: आवेदन एक exe और स्रोत कोड (VisualC++ 6) के साथ आता है

ShowVer.exe command-line VERSIONINFO display program

हमेशा की तरह।

आउटपुट बाहर सभी मेटा डेटा उपलब्ध:

एक जर्मन 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 
77

आप PowerShell का उपयोग कर सकते इच्छित जानकारी प्राप्त करने के लिए।

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

डिफ़ॉल्ट रूप से यह प्रदर्शित करेगा ProductVersion और FileVersion लेकिन पूर्ण VERSIONINFO उपलब्ध है। अर्थात। Systernals से टिप्पणियां वापस जाने के लिए

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

यह जवाब होना चाहिए। यह एकमात्र उत्तर है जो बॉक्स ऑफ आउट टूल्स पर भरोसा नहीं करता है। –

+7

पाइप टू फ्लू * सभी संस्करणइन्फो गुण प्राप्त करने के लिए: पीएस सी: \> (प्राप्त करें आइटम: \ विंडोज \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe) .VersionInfo | FL * – Glenn

+0

इसका उपयोग करके मुझे संस्करण संख्या के लिए 0 और सभी is * गुणों के लिए झूठा मिला। – NobleUplift

9
C:\>wmic datafile where name="C:\\Windows\\System32\\kernel32.dll" get version 
Version 
6.1.7601.18229 
+0

यह केवल उदाहरणों पर काम करता है = डीएल लोड होना चाहिए। –

+0

और इसे चलाने के लिए आपको व्यवस्थापक समूह में होना चाहिए। – neves

3

यह फ़ंक्शन Cygwin बैश का उपयोग कर किसी भी फाइल के लिए NTFS Windows फ़ाइल विवरण (वास्तविक आर-क्लिक करें -प्रोपर्टीज-सूचना) शब्द

फ़ाइनोफ़() के लिए फ़ाइल पथ पास करें, यूनिक्स पथ, डॉस पथ, रिश्तेदार या पूर्ण हो सकता है। फ़ाइल को एक पूर्ण निक्स पथ में परिवर्तित कर दिया गया है, फिर यह देखने के लिए जांच की गई है कि यह वास्तव में एक नियमित/मौजूदा फ़ाइल है या नहीं। फिर एक पूर्ण विंडोज पथ में परिवर्तित हो गया और "wmic" को भेजा गया। फिर जादू, आपके पास टर्मिनल में विंडोज़ फाइल विवरण सही है। उपयोग: सिगविन, साइगपाथ, sed, और awk। विंडोज डब्लूएमआई "wmic.exe" को परिचालन करने की आवश्यकता है। उत्पादन के लिए आसान के लिए सही है ... makecab साथ

$ 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 "[email protected]")" ]] || { echo "bad-file"; return 1; } 
    echo "$(wmic datafile where name=\""$(echo "$(cygpath -wa "[email protected]")" | sed 's/\\/\\\\/g')"\" get /value)" |\ 
    sed 's/\r//g;s/^M$//;/^$/d' | awk -F"=" '{print $1"=""\033[1m"$2"\033[0m" }' 
} 
+0

FYI यह विल रिटर्न संस्करण = #### तो बस इसे इस तरह से फ़िल्टर करें: 'finfo file.dll | awk -F "=" '/ संस्करण/{प्रिंट $ 2}' 'या 'grep संस्करण | cut -d '=' -f 2' या बेहतर विकल्प अभी तक विकल्पों को पारित करने के लिए कार्यक्षमता में जोड़ें। यानी 'finfo -V file.dll' – jonretting

+1

जब सेशन ने सिगविन बैश के लिए पूछा तो डाउनवोट क्यों करें। यहां यह फ़ंक्शन फॉर्म में है, डॉस बिट्स को साफ़ करता है, इसे सही तरीके से प्रारूपित करता है, और इसे दी गई किसी भी फ़ाइल के लिए "wmic datafile" स्तर की जानकारी प्रदान करता है। – jonretting

0

और एक ही रास्ता:

; @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*" 

उदाहरण निर्गम (यह एक स्ट्रिंग संस्करण है जो wmic विधि के लिए :) एक छोटा सा है है):

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 

और एक और का उपयोग करना shell.application और संकर बैच \ jscript.Her ई के 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(); 

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