Як можна отримати інформацію про версію з файлу .dll
або .exe
файлу в PowerShell?
Я спеціально зацікавлені в File Version
, хоча інша інформація про версії (тобто Company
, Language
, Product Name
і т.д.) було б корисно , як добре.
Як можна отримати інформацію про версію з файлу .dll
або .exe
файлу в PowerShell?
Я спеціально зацікавлені в File Version
, хоча інша інформація про версії (тобто Company
, Language
, Product Name
і т.д.) було б корисно , як добре.
Відповіді:
Оскільки PowerShell може викликати .NET- класи, ви можете зробити наступне:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("somefilepath").FileVersion
Або як зазначено тут у списку файлів:
get-childitem * -include *.dll,*.exe | foreach-object { "{0}`t{1}" -f $_.Name, [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_).FileVersion }
Або навіть приємніше як сценарій: https://jtruher3.wordpress.com/2006/05/14/powershell-and-file-version-information/
get-item C:\Windows\System32\ubpm.dll | % VersionInfo | fl * -force
та порівняйте FilePrivatePart з останньою частиною FileVersion. FileVersion показує, що оригінально постачалася, а не виправлена версія. Ця команда, з іншого боку, показує номер виправленої версії: (get-command C: \ Windows \ System32 \ ubpm.dll) .Version
(Get-Command ... ).Version
що ProductVersion повертає не FileVersion , а іноді це має значення. Отже, для повного рішення, яке фактично повертає оновлений FileVersion, ознайомтеся з прикладом Update-TypeData в моїй відповіді нижче.
Сьогодні ви можете отримати FileVersionInfo від Get-Item або Get-ChildItem, але він покаже оригінальний FileVersion від поставленого продукту, а не оновлену версію. Наприклад:
(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.FileVersion
Цікаво, що ви можете отримати оновлений (виправлений) ProductVersion , скориставшись цим:
(Get-Command C:\Windows\System32\Lsasrv.dll).Version
Відмінність, яку я роблю між "оригінальним" і "виправленим", в основному обумовлена способом обчислення FileVersion ( див. Документи тут ). В основному з моменту Vista, API Windows GetFileVersionInfo запитує частину інформації про версію з файлу нейтральної мови (exe / dll) та нефіксованої частини з файлу mui, що відповідає мові (який не оновлюється щоразу, коли файли змінюються ).
Так що з таким файлом, як lsasrv (який замінили через проблеми безпеки в SSL / TLS / RDS у листопаді 2014 року), версії, які повідомлялися цими двома командами (принаймні на деякий час після цієї дати), були різними, а друга - більш "правильна" версія.
Однак, хоча це правильно в LSASrv, можливо, ProductVersion і FileVersion можуть бути різними (насправді це звичайно). Тож єдиний спосіб отримати це оновлений Fileversion прямо з асемблерного файлу - це створити його самостійно з частин, приблизно так:
Get-Item C:\Windows\System32\Lsasrv.dll | ft FileName, File*Part
Або витягнувши дані з цього:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)
Ви можете легко додати це до всіх об'єктів FileInfo, оновивши TypeData в PowerShell:
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 ...
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Get-Command
застосований до dll-файл. Не могли б ви детальніше розглянути його ефект?
(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.ProductVersion
є більш новий простіший спосіб отримати ту саму інформацію про ProductVersion, яку зафіксовано у відповіді? Я не дуже довіряю Microsoft постійно використовувати цей термін ProductVersion
.
'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: \ Шлях \ До \ MyAssembly.dll
Я з великим успіхом використовував його для цілого каталогу збірок.
Я усвідомлюю, що на це вже відповіли, але якщо хтось зацікавлений у введенні меншої кількості символів, я вважаю, що це найкоротший спосіб написання цього в 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-item .\filename.exe).VersionInfo | FL
Ви також можете отримати будь-яке певне майно від VersionInfo, таким чином:
(get-item .\filename.exe).VersionInfo.FileVersion
Це досить близько до техніки dir.
Це ґрунтується на інших відповідях, але саме я був після:
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Get-Command
застосований до dll-файл. Чи можете ви детальніше розглянути його ефект (перш ніж навіть зателефонувати за властивістю FileVersionInfo)?
FileVersionInfo
само, як і файли EXE. Застосувавши цю команду до шляху, ви отримаєте інформацію про версію файлу!
Я вважаю це корисним:
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 (шлях) буде працювати, але пам’ятайте, що ви також можете отримати всіх членів 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