Получить версию файла в PowerShell
Как получить информацию о версии из файла 9X_file .dll
или .exe
в PowerShell?
Меня особенно интересует 9X_files File Version
, хотя и другая информация о версии (то 9X_powershell есть Company
, Language
, Product Name
и т. д.) также была бы полезна.
Ответ #1
Ответ на вопрос: Получить версию файла в PowerShell
В настоящее время вы можете получить FileVersionInfo 9X_versioninfo с помощью Get-Item или Get-ChildItem, но 9X_files он покажет исходную версию FileVersion из 9X_powershell поставляемого продукта, а не обновленную 9X_powershell версию. Например:
(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.FileVersion
Интересно, что вы можете 9X_powershell получить обновленную (исправленную) ProductVersion с помощью 9X_files этого:
(Get-Command C:\Windows\System32\Lsasrv.dll).Version
Различие, которое я делаю между «оригинальным» и 9X_versioninfo «исправленным», в основном связано с тем, как 9X_files вычисляется FileVersion (see the docs here). По сути, начиная 9X_windows-powershell с Vista, Windows API GetFileVersionInfo 9X_windows-powershell запрашивает часть информации о версии из 9X_versioninfo независимого от языка файла (exe/dll), а 9X_powershell нефиксированную часть — из файла mui для 9X_file конкретного языка (который не обновляется 9X_versioninfo каждый раз при изменении файлов). ).
Таким 9X_powershell образом, с таким файлом, как lsasrv (который 9X_files был заменен из-за проблем с безопасностью 9X_file в SSL/TLS/RDS в ноябре 2014 г.), версии, сообщаемые 9X_file этими двумя командами (по крайней мере, какое-то 9X_versioninfo время после этой даты), были разными, а 9X_windows-powershell вторая более «правильный» вариант.
Однако, несмотря 9X_powershell на то, что в LSASrv это правильно, версии 9X_files ProductVersion и FileVersion могут отличаться 9X_files (на самом деле это обычное дело). Таким 9X_versioninfo образом, единственный способ получить обновленную версию 9X_windows-powershell файла прямо из файла сборки — собрать ее 9X_file самостоятельно из частей, примерно так:
Get-Item C:\Windows\System32\Lsasrv.dll | ft FileName, File*Part
Или 9X_files взяв данные отсюда:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)
Вы можете легко добавить 9X_file это ко всем объектам FileInfo, обновив TypeData 9X_versioninfo в PowerShell:
Update-TypeData -TypeName System.IO.FileInfo -MemberName FileVersion -MemberType ScriptProperty -Value {
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) | % {
[Version](($_.FileMajorPart, $_.FileMinorPart, $_.FileBuildPart, $_.FilePrivatePart)-join".")
}
}
Теперь каждый раз, когда вы 9X_powershell делаете Get-ChildItem
или Get-Item
, у вас будет свойство FileVersion
, которое 9X_versioninfo показывает обновленную версию FileVersion...
- ** Предупреждение ** FileVersionInfo.FileVersion - это строковое представление, которое может быть устаревшим. Вы должны посмотреть FileVersionInfo.FileMajorPart, FileMinorPart, ...
Ответ #2
Ответ на вопрос: Получить версию файла в PowerShell
Поскольку PowerShell может вызывать .NET классов, вы 9X_versioninfo можете сделать следующее:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("somefilepath").FileVersion
Или как noted here в списке 9X_files файлов:
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/
- Хотя другие ответы дают более короткие команды, все те, которые я пробовал, распечатать слишком много информации и усечь путь к файлу до «...». Вторая команда в этом ответе дает именно то, ч ...
Ответ #3
Ответ на вопрос: Получить версию файла в PowerShell
'dir' - это псевдоним для Get-ChildItem, который 9X_powershell будет возвращать класс System.IO.FileInfo, когда 9X_versioninfo вы вызываете его из файловой системы, имеющей 9X_windows-powershell VersionInfo в качестве свойства. Итак ...
Чтобы 9X_file получить информацию о версии отдельного 9X_file файла, сделайте следующее:
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 :
Для нескольких 9X_windows-powershell файлов это:
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
Ответ #4
Ответ на вопрос: Получить версию файла в PowerShell
Я понимаю, что на это уже был дан ответ, но 9X_powershell если кто-то хочет набирать меньше символов, я 9X_powershell считаю, что это самый короткий способ написать 9X_windows-powershell это в PS v3 +:
ls application.exe | % versioninfo
-
ls
- это псевдоним дляGet-ChildItem
-
%
- это псевдоним дляForEach-Object
-
versioninfo
вот сокращенный способ написания{$_.VersionInfo}
Преимущество использования 9X_powershell ls
таким образом заключается в том, что вы 9X_versioninfo можете легко адаптировать его для поиска 9X_versioninfo данного файла во вложенных папках. Например, следующая 9X_file команда вернет информацию о версии для всех 9X_files файлов с именем application.exe
во вложенных папках:
ls application.exe -r | % versioninfo
-
-r
- это псевдоним для-Recurse
Вы 9X_windows-powershell можете дополнительно уточнить это, добавив 9X_powershell -ea silentlycontinue
, чтобы игнорировать такие вещи, как ошибки 9X_file разрешений в папках, которые вы не можете 9X_windows-powershell искать:
ls application.exe -r -ea silentlycontinue | % versioninfo
-
-ea
- это псевдоним для-ErrorAction
Наконец, если вы получаете многоточие 9X_file (...) в ваших результатах, вы можете добавить 9X_windows-powershell | fl
, чтобы вернуть информацию в другом формате. Это 9X_powershell возвращает гораздо более подробную информацию, хотя 9X_versioninfo и в виде списка, а не по одной строке для 9X_windows-powershell каждого результата:
ls application.exe -r -ea silentlycontinue | % versioninfo | fl
-
fl
- это псевдоним дляFormat-List
Я понимаю, что это очень 9X_file похоже на ответ xcud в том, что ls
и dir
являются 9X_file псевдонимами для Get-ChildItem
. Но я надеюсь, что мой 9X_versioninfo "кратчайший" метод кому-то поможет.
Последний 9X_file пример можно написать от руки следующим 9X_versioninfo образом:
Get-ChildItem -Filter application.exe -Recurse -ErrorAction SilentlyContinue | ForEach-Object {$_.VersionInfo} | Format-List
... но я думаю, что мой путь круче 9X_powershell и некоторым легче запомнить. (Но в основном 9X_windows-powershell круче).
Ответ #5
Ответ на вопрос: Получить версию файла в PowerShell
Я предпочитаю установить PowerShell Community Extensions и просто использовать 9X_files предоставляемую им функцию Get-FileVersionInfo.
Вот 9X_versioninfo так:
Get-FileVersionInfo MyAssembly.dll
с выводом типа:
ProductVersion FileVersion FileName -------------- ----------- -------- 1.0.2907.18095 1.0.2907.18095 C:\Path\To\MyAssembly.dll
Я с большим успехом использовал 9X_windows-powershell его против целого каталога сборок.
Ответ #6
Ответ на вопрос: Получить версию файла в PowerShell
Еще один способ сделать это - использовать 9X_files встроенную технику доступа к файлам:
(get-item .\filename.exe).VersionInfo | FL
Вы также 9X_powershell можете получить любое конкретное свойство 9X_files из VersionInfo, например:
(get-item .\filename.exe).VersionInfo.FileVersion
Это очень похоже 9X_versioninfo на технику dir.
Ответ #7
Ответ на вопрос: Получить версию файла в PowerShell
Это основано на других ответах, но это именно то, что 9X_windows-powershell я искал:
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Ответ #8
Ответ на вопрос: Получить версию файла в PowerShell
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")
9X_files
Ответ #9
Ответ на вопрос: Получить версию файла в PowerShell
Я считаю это полезным:
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
}
9X_file
Ответ #10
Ответ на вопрос: Получить версию файла в PowerShell
Как сказал EBGreen, [System.Diagnostics.FileVersionInfo]::GetVersionInfo(path) будет 9X_versioninfo работать, но помните, что вы также можете 9X_powershell получить все члены FileVersionInfo, например:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo(path).CompanyName
Вы 9X_file должны иметь возможность использовать каждый 9X_powershell элемент FileVersionInfo, задокументированный 9X_file здесь, что даст вам практически все, что 9X_file вы когда-либо хотели от файла.
Ответ #11
Ответ на вопрос: Получить версию файла в PowerShell
Вот альтернативный способ. Для выбора версии 9X_versioninfo используется Get-WmiObject CIM_DATAFILE.
(Get-WmiObject -Class CIM_DataFile -Filter "Name='C:\\Windows\\explorer.exe'" | Select-Object Version).Version
-
1
-
11
-
4
-
3
-
2
-
4
-
7
-
7
-
2
-
4
-
1
-
5
-
4
-
3
-
4
-
1
-
3
-
5
-
3
-
1
-
4
-
3
-
1
-
2
-
1
-
8
-
6
-
4
-
9
-
8
-
5
-
27
-
2
-
13
-
22
-
12
-
13
-
21
-
12
-
21
-
42
-
13
-
16
-
7
-
6
-
14
-
19
-
7
-
4
-
22