أداة سطر الأوامر إلى تفريغ Windows DLL الإصدار ؟
-
03-07-2019 - |
سؤال
كنت في حاجة الى أداة سطر الأوامر إلى تفريغ ويندوز القياسية 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" }'
}
(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