Получить версию файла в 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
}
Как сказал ЭБГрин, [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