سؤال

كنت في حاجة الى أداة سطر الأوامر إلى تفريغ ويندوز القياسية DLL معلومات النسخة لذا يمكن معالجة ذلك عن طريق باش النصي (Cygwin).

كما مطور جافا أنا لا تستخدم Microsoft أدوات التطوير (على الرغم من أن لدي القليل من الخبرة المضمنة مع Microsoft Visual C++ 4.0 و Microsoft Visual Basic 6.0).

الأداة المناسبة يبدو أن mt.exe, ، ورد على ذلك.ولكن الفرصة الوحيدة التي وجدت أن هذا التطبيق لتحميل 1.29 GB ISO من Windows SDK لنظام التشغيل Windows Server 2008 .NET Framework.أنا لا يمكن أن نعتقد أن هذا هو السبيل الوحيد للقيام بذلك.

وقد وجدت أيضا القليل من التطبيق على شبكة الإنترنت يسمى PEView, لكنه يعرض الكثير من (وغير مجدية في حالتي) المعلومات وليس تطبيق سطر الأوامر.

القياسية objdump المجمعة داخل Cygwin يمكن أيضا تفريغ بعض المعلومات عن ملفات DLL, ولكن أنا لا يمكن أن نرى خيار تفريغ DLL الإصدار.علما بأن MajorImageVersion, MinorImageVersion وغيرها من المجالات ملقاة بواسطة هذه الأداة (مع -p الخيار) لا تتعلق الخاصة DLL الإصدار.

أي بدائل عن ماذا تفعل ؟ ربما فاتني بعض المهم objdump الخيار ؟ هو mt.exe خياري الوحيد ؟ إذا كان هذا هو الحال, هل من الممكن الحصول عليه بشكل منفصل عن ويندوز SDK ؟

هل كانت مفيدة؟

المحلول

ويمكنك ايضا ان ننظر في filever.exe، والتي يمكن تحميلها كجزء من في أدوات دعم Windows XP SP2 حزمة - فقط 4.7MB التحميل

نصائح أخرى

ويمكنك استخدام PowerShell لتحصل على المعلومات التي تريدها.

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

وافتراضيا هذا سيعرض ProductVersion والأساسية FileVersion ولكن VERSIONINFO هو متاح. بمعنى آخر. للعودة تعليقات

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

استخدم مايكروسوفت سسنترنلس 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

أو يمكنك إنشاء واحدة بنفسك.فتح مقابل إنشاء تطبيق وحدة تحكم جديد.إنشاء مشروع بسيط مع ATL أو MFC الدعم ترك stdafx الخيار محددا ولكن لا تحقق 'مشروع فارغ و نسميها VersionInfo.

ستحصل على مشروع بسيط مع 2 الملفات:VersionInfo.cpp و VersionInfo.ح

فتح الملف cpp و لصق التالية في ذلك ، ثم ترجمة.سوف تكون قادرة على تشغيله ، الحجة الأولى هي كامل الملف سوف طباعة "المنتج:5.6.7.8 الملف:1.2.3.4" استنادا إلى الإصدار الموارد كتلة.إذا لا يوجد نسخة الموارد انها سوف تعود -1, وإلا 0.

يجمع إلى 8k الثنائية باستخدام dll CRT 60k مع كل شيء مرتبط بشكل ثابت (في C++ الخيارات تغيير "رمز جيل صفحة خيارات وقت التشغيل" إلى "/MT")

HTH.

PS.إذا كنت لا تريد استخدام Visual Studio, أنها سوف لا تزال تجميع باستخدام أي برنامج التحويل البرمجي c++ (تمنيت) ، ولكن سوف يكاد يكون من المؤكد أن تغيير #pragma - فقط تحديد ليب في رابط الإعدادات بدلا من ذلك ، 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;
}
C:\>wmic datafile where name="C:\\Windows\\System32\\kernel32.dll" get version
Version
6.1.7601.18229

والأدوات listdlls من Systernals قد القيام بهذه المهمة: HTTP: // شبكة التكنولوجيا. microsoft.com/en-us/sysinternals/bb896656.aspx

listdlls -v -d mylib.dll

وهذه ترجع تفاصيل الملفات NTFS ويندوز عن أي ملف باستخدام سيغوين باش (الفعلية انقر للخصائص ص-المعلومات) لمصطلح

وتمرير مسار الملفات إلى finfo ()، يمكن أن يكون يونكس مسار، مسار دوس، النسبي أو المطلق. يتم تحويل الملف إلى مسار لا شىء المطلق، ثم فحصها لمعرفة ما اذا كان هو في الواقع العادية / القائمة ملف. ثم تحويلها إلى مسار النوافذ المطلقة وإرسالها إلى "WMIC". السحر ذلك الحين، لديك ملف ويندوز تفاصيل الحق في المحطة. الاستعمالات: سيغوين، cygpath، الحوار الاقتصادي الاستراتيجي، و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" }'
}
<ع> استخدام بوويرشيل فمن الممكن أن مجرد الحصول على سلسلة الإصدار 2.3.4 أي من أي دلل أو إكس مع الأمر التالي

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

واختبارها على ويندوز 10

وهناك تطبيق سطر الأوامر تسمى "ShowVer" في CodeProject:

ShowVer.exe سطر الأوامر VERSIONINFO برنامج عرض

وكالعادة يأتي التطبيق مع إكس وشفرة المصدر (VisualC ++ 6).

وخارج مخرجات جميع البيانات الفوقية المتاحة:

في نظام 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

ووطريقة واحدة مع 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*"

والمثال الناتج (له نسخة سلسلة وهو إضافة صغيرة لطريقة 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.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();

وتستخدم ضد 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top