سؤال

كيف يمكنك الحصول على معلومات الإصدار من ملف .dll أو .exe الملف في PowerShell؟

أنا مهتم على وجه التحديد File Version, ، على الرغم من معلومات الإصدار الأخرى (أي، Company, Language, Product Name, إلخ) سيكون مفيدًا أيضًا.

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

المحلول

منذ PowerShell يمكن الاتصال .شبكة الطبقات، يمكنك القيام بما يلي:

[System.Diagnostics.FileVersionInfo]::GetVersionInfo("somefilepath").FileVersion

أو كما وأشار هنا في قائمة الملفات:

get-childitem * -include *.dll,*.exe | foreach-object { "{0}`t{1}" -f $_.Name, [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_).FileVersion }

أو حتى أجمل كبرنامج نصي: http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!125.entry

نصائح أخرى

في الوقت الحاضر، يمكنك الحصول على FileVersionInfo من Get-Item أو Get-ChildItem، ولكنه سيُظهر FileVersion الأصلي من المنتج الذي تم شحنه، وليس الإصدار المحدث.على سبيل المثال:

(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.FileVersion

ومن المثير للاهتمام أنه يمكنك الحصول على التحديث (المصحح) إصدار المنتج باستخدام هذا:

(Get-Command C:\Windows\System32\Lsasrv.dll).Version

لاحظ أنه مع ملف مثل lsasrv (الذي تم استبداله بسبب مشكلات أمنية في SSL/TLS/RDS في نوفمبر 2014)، تختلف الإصدارات التي تم الإبلاغ عنها بواسطة هذين الأمرين، كما أن الثانية هو الإصدار الصحيح.

ومع ذلك، على الرغم من صحة ذلك في LSASrv، فمن الممكن أن يكون ProductVersion وFileVersion مختلفين (وهو أمر شائع في الواقع).وبالتالي فإن الطريقة الوحيدة للحصول على محدث Fileversion هو أن تبنيه بنفسك، شيء من هذا القبيل:

Get-Item C:\Windows\System32\Lsasrv.dll | ft FileName, File*Part

أو بالأحرى مثل هذا:

Update-TypeData -TypeName System.IO.FileInfo -MemberName FileVersion -MemberType ScriptProperty -Value {
   [System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) | % {
      [Version](($_.FileMajorPart, $_.FileMinorPart, $_.FileBuildPart, $_.FilePrivatePart)-join".") 
   }
}

الآن في كل مرة تفعل ذلك Get-ChildItem أو Get-Item سيكون لديك FileVersion الخاصية التي تظهر FileVersion المحدث ...

'dir' هو اسم مستعار لـ Get-ChildItem والذي سيعيد فئة System.IO.FileInfo عندما تستدعيه من نظام الملفات الذي يحتوي على VersionInfo كخاصية.لذا ...

للحصول على معلومات الإصدار لملف واحد، قم بما يلي:

PS C:\Windows> (dir .\write.exe).VersionInfo | fl


OriginalFilename : write
FileDescription  : Windows Write
ProductName      : Microsoft® Windows® Operating System
Comments         :
CompanyName      : Microsoft Corporation
FileName         : C:\Windows\write.exe
FileVersion      : 6.1.7600.16385 (win7_rtm.090713-1255)
ProductVersion   : 6.1.7600.16385
IsDebug          : False
IsPatched        : False
IsPreRelease     : False
IsPrivateBuild   : False
IsSpecialBuild   : False
Language         : English (United States)
LegalCopyright   : © Microsoft Corporation. All rights reserved.
LegalTrademarks  :
PrivateBuild     :
SpecialBuild     :

بالنسبة لملفات متعددة هذا:

PS C:\Windows> dir *.exe | %{ $_.VersionInfo }

ProductVersion   FileVersion      FileName
--------------   -----------      --------
6.1.7600.16385   6.1.7600.1638... C:\Windows\bfsvc.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\explorer.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\fveupdate.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\HelpPane.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\hh.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\notepad.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\regedit.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\splwow64.exe
1,7,0,0          1,7,0,0          C:\Windows\twunk_16.exe
1,7,1,0          1,7,1,0          C:\Windows\twunk_32.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\winhlp32.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\write.exe

أنا أفضل تثبيت ملحقات مجتمع PowerShell واستخدم فقط وظيفة Get-FileVersionInfo التي توفرها.

مثل ذلك:

Get-FileVersionInfo MyAssembly.dll

مع الإخراج مثل:

ProductVersion   FileVersion      FileName
--------------   -----------      --------
1.0.2907.18095   1.0.2907.18095   C:\Path\To\MyAssembly.dll

لقد استخدمته ضد دليل التجميعات بأكمله بنجاح كبير.

هناك طريقة أخرى للقيام بذلك وهي استخدام تقنية الوصول إلى الملفات المضمنة:

(get-item .\filename.exe).VersionInfo | FL

يمكنك أيضًا الحصول على أي خاصية معينة من VersionInfo، وبالتالي:

(get-item .\filename.exe).VersionInfo.FileVersion

هذا قريب جدًا من تقنية dir.

أدرك أن هذا قد تمت الإجابة عليه بالفعل، ولكن إذا كان أي شخص مهتمًا بكتابة عدد أقل من الأحرف، فأعتقد أن هذه هي أقصر طريقة لكتابة هذا في PS v3+:

ls application.exe | % versioninfo
  • ls هو اسم مستعار ل Get-ChildItem
  • % هو اسم مستعار ل ForEach-Object
  • versioninfo هنا طريقة مختصرة للكتابة {$_.VersionInfo}

فائدة الاستخدام ls وبهذه الطريقة يمكنك بسهولة تكييفه للبحث عن ملف معين داخل المجلدات الفرعية.على سبيل المثال، سيرجع الأمر التالي معلومات الإصدار لجميع الملفات التي تم استدعاؤها application.exe ضمن المجلدات الفرعية:

ls application.exe -r | % versioninfo
  • -r هو اسم مستعار ل -Recurse

يمكنك تحسين هذا بشكل أكبر عن طريق إضافة -ea silentlycontinue لتجاهل أشياء مثل أخطاء الأذونات في المجلدات التي لا يمكنك البحث فيها:

ls application.exe -r -ea silentlycontinue | % versioninfo
  • -ea هو اسم مستعار ل -ErrorAction

أخيرًا، إذا كنت تحصل على علامات حذف (...) في نتائجك، فيمكنك إلحاقها | fl لإرجاع المعلومات بتنسيق مختلف.يؤدي هذا إلى إرجاع تفاصيل أكثر بكثير، على الرغم من تنسيقها في قائمة، بدلاً من سطر واحد لكل نتيجة:

ls application.exe -r -ea silentlycontinue | % versioninfo | fl
  • fl هو اسم مستعار ل Format-List

أدرك أن هذا مشابه جدًا لرد xcud في ذلك ls و dir كلاهما أسماء مستعارة لـ Get-ChildItem.لكنني آمل أن تساعد طريقتي "الأقصر" شخصًا ما.

يمكن كتابة المثال الأخير بخط طويل بالطريقة التالية:

Get-ChildItem -Filter application.exe -Recurse -ErrorAction SilentlyContinue | ForEach-Object {$_.VersionInfo} | Format-List

...لكنني أعتقد أن طريقتي أكثر روعة، وبالنسبة للبعض، أسهل في التذكر.(ولكن في الغالب أكثر برودة).

هذا هو قائم على على الإجابات الأخرى، ولكن هذا هو بالضبط ما كنت بعد:

(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")

أجد هذا مفيدًا:

function Get-Version($filePath)
{
   $name = @{Name="Name";Expression= {split-path -leaf $_.FileName}}
   $path = @{Name="Path";Expression= {split-path $_.FileName}}
   dir -recurse -path $filePath | % { if ($_.Name -match "(.*dll|.*exe)$") {$_.VersionInfo}} | select FileVersion, $name, $path
}

كما قال EBGreen، سيعمل [System.Diagnostics.FileVersionInfo]::GetVersionInfo(path)، لكن تذكر أنه يمكنك أيضًا الحصول على جميع أعضاء FileVersionInfo، على سبيل المثال:

[System.Diagnostics.FileVersionInfo]::GetVersionInfo(path).CompanyName

يجب أن تكون قادرًا على استخدام كل عضو في FileVersionInfo الموثق هنا، والذي سيوفر لك بشكل أساسي أي شيء تريده بخصوص الملف.

هنا طريقة بديلة.ويستخدم Get-WmiObject CIM_DATAFILE لتحديد الإصدار.

(Get-WmiObject -Class CIM_DataFile -Filter "Name='C:\\Windows\\explorer.exe'" | Select-Object Version).Version
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top