Получить версию файла в PowerShell

Вопрос задан: 11 лет назад Последняя активность: 7 месяцев назад
up 133 down

Как вы можете получить информацию о версии от .dll или же .exe файл в PowerShell?

Я особенно заинтересован в File Version, хотя другая информация о версии (то есть Company, Language, Product Name, и т. д.) также было бы полезно.

11 ответов

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Реклама

up 156 down

В настоящее время вы можете получить 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, Windows API 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...

up 119 down accepted

С 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

up 47 down

'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
up 16 down

Я предпочитаю устанавливать Расширения сообщества PowerShell и просто используйте функцию Get-FileVersionInfo, которую он предоставляет.

Вот так:

Get-FileVersionInfo MyAssembly.dll

с выводом как:

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

Я использовал его против всего каталога сборок с большим успехом.

up 11 down

Еще один способ сделать это - использовать встроенную технику доступа к файлам:

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

Вы также можете получить любое конкретное свойство из VersionInfo, таким образом:

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

Это довольно близко к технике DIR.

up 9 down

Я понимаю, что на это уже дан ответ, но если кто-то заинтересован в наборе меньшего количества символов, я считаю, что это самый короткий способ написать это в 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

... но я думаю, что мой путь круче и для некоторых легче запомнить. (Но в основном круче).

up 7 down

Это основано на других ответах, но это именно то, что я был после:

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

Я считаю это полезным:

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
}
up 2 down

Здесь альтернативный метод. Он использует Get-WmiObject CIM_DATAFILE для выбора версии.

(Get-WmiObject -Class CIM_DataFile -Filter "Name='C:\\Windows\\explorer.exe'" | Select-Object Version).Version
up 2 down

Как сказал EBGreen, [System.Diagnostics.FileVersionInfo] :: GetVersionInfo (path) будет работать, но помните, что вы также можете получить все члены FileVersionInfo, например:

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

Вы должны быть в состоянии использовать каждого члена FileVersionInfo, описанного здесь, что даст вам практически все, что вы когда-либо хотели о файле.

Ошибка 505

Что-то пошло не так

Попробуйте воспользоваться поиском