احصل على نسخة الملف في PowerShell
-
09-06-2019 - |
سؤال
كيف يمكنك الحصول على معلومات الإصدار من ملف .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