Pergunta

Como você pode obter as informações de versão de um .dll ou .exe arquivo em PowerShell?

Estou especialmente interessada em File Version, apesar de outras informações de versão (que é, Company, Language, Product Name, etc.) seria útil também.

Foi útil?

Solução

Desde PowerShell pode chamar .NET classes, você pode fazer o seguinte:

[System.Diagnostics.FileVersionInfo]::GetVersionInfo("somefilepath").FileVersion

Ou como anotado aqui em uma lista de arquivos:

get-childitem * -include *.dll,*.exe | foreach-object { "{0}`t{1}" -f $_.Name, [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_).FileVersion }

Ou ainda melhor, como um script: http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!125.entrada

Outras dicas

Hoje em dia, você pode obter o FileVersionInfo a partir do Get-Item ou Get-ChildItem, mas vai mostrar o original FileVersion de envio do produto, e não a versão atualizada.Por exemplo:

(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.FileVersion

Curiosamente, você pode obter a atualização (patch) ProductVersion usando este:

(Get-Command C:\Windows\System32\Lsasrv.dll).Version

Note que, com um arquivo como lsasrv (que foi substituído devido a problemas de segurança em SSL/TLS/RDS, em novembro de 2014) as versões relatadas por estes dois comandos são diferentes, e o segunda é a versão correta.

No entanto, embora seja correto em LSASrv, é possível que o ProductVersion e FileVersion para ser diferente, é comum que, na verdade).Assim, a única maneira de obter o atualizado Fileversion é construir-se a si mesmo, algo como isto:

Get-Item C:\Windows\System32\Lsasrv.dll | ft FileName, File*Part

Ou melhor, como esta:

Update-TypeData -TypeName System.IO.FileInfo -MemberName FileVersion -MemberType ScriptProperty -Value {
   [System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) | % {
      [Version](($_.FileMajorPart, $_.FileMinorPart, $_.FileBuildPart, $_.FilePrivatePart)-join".") 
   }
}

Agora, cada vez que você fizer Get-ChildItem ou Get-Item você vai ter um FileVersion propriedade que mostra atualizados FileVersion ...

'dir' é um alias para Get-ChildItem que vai voltar um Sistema.IO.Classe FileInfo quando você está chamando o sistema de arquivos que possui VersionInfo como uma propriedade.Então ...

Para obter as informações de versão de um ficheiro único de fazer isso:

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     :

Para vários arquivos, este:

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

Eu prefiro instalar o Comunidade Do PowerShell Extensions e é só usar o Get-FileVersionInfo função que ele fornece.

Assim:

Get-FileVersionInfo MyAssembly.dll

com a saída como:

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

Eu o usei contra todo um diretório de módulos (assemblies), com grande sucesso.

Apenas uma outra maneira de fazer isso é usar o built-in do arquivo técnica de acesso:

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

Você também pode obter qualquer propriedade específica fora VersionInfo, assim:

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

Isso é bastante próximo à dir técnica.

Sei que isto já foi respondida, mas se alguém se interessa em escrever menos caracteres, eu acredito que este é o caminho mais curto de escrever isso no PS v3+:

ls application.exe | % versioninfo
  • ls é um alias para Get-ChildItem
  • % é um alias para ForEach-Object
  • versioninfo aqui é uma forma abreviada de escrever {$_.VersionInfo}

A vantagem de usar ls desta maneira é que você pode facilmente adaptá-lo para procurar um determinado arquivo dentro de subpastas.Por exemplo, o seguinte comando irá retornar informações de versão para todos os arquivos chamados application.exe dentro de subpastas:

ls application.exe -r | % versioninfo
  • -r é um alias para -Recurse

Você pode refinar ainda mais essa adicionando -ea silentlycontinue para ignorar as coisas como erros de permissão em pastas que você não pode procurar:

ls application.exe -r -ea silentlycontinue | % versioninfo
  • -ea é um alias para -ErrorAction

Finalmente, se você estiver chegando de reticências (...) em seus resultados, você pode acrescentar | fl para retornar as informações em um formato diferente.Isso retorna com muito mais detalhes, embora formatado em uma lista, ao invés de uma linha por resultado:

ls application.exe -r -ea silentlycontinue | % versioninfo | fl
  • fl é um alias para Format-List

Sei que isto é muito semelhante ao xcud resposta em que ls e dir são ambos os aliases para Get-ChildItem.Mas eu estou esperando o meu "mais curto" método vai ajudar alguém.

O último exemplo poderia ser escrito em longa-mão da seguinte forma:

Get-ChildItem -Filter application.exe -Recurse -ErrorAction SilentlyContinue | ForEach-Object {$_.VersionInfo} | Format-List

...mas eu acho que o meu caminho é mais frio e, para alguns, o mais fácil de lembrar.(Mas, principalmente, cooler).

Este é com base em outras respostas, mas é exatamente o que eu estava atrás:

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

Eu acho isso útil:

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
}

Como EBGreen disse: [Sistema.O diagnóstico.FileVersionInfo]::GetVersionInfo(caminho) vai funcionar, mas lembre-se que você também pode obter todos os membros da FileVersionInfo, por exemplo:

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

Você deve ser capaz de usar cada membro da FileVersionInfo documentado aqui, que você vai chegar, basicamente, qualquer coisa que você poderia querer sobre o arquivo.

Aqui um método alternativo.Ele usa Get-WmiObject CIM_DATAFILE para selecionar a versão.

(Get-WmiObject -Class CIM_DataFile -Filter "Name='C:\\Windows\\explorer.exe'" | Select-Object Version).Version
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top