Вопрос

Как получить информацию о версии из .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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top