Obter versão do arquivo no PowerShell


146

Como você pode obter as informações da versão de um arquivo .dllou .exeno PowerShell?

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

Respostas:


140

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

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

Ou como observado 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: https://jtruher3.wordpress.com/2006/05/14/powershell-and-file-version-information/


8
Consulte @Jaykul para obter uma solução que não requer um objeto .NET. A resposta de IMHO Jaykul deveria ter sido selecionada como a resposta :)
Thomas Bratt

2
Embora as outras respostas dêem comandos mais curtos, todas as que tentei imprimem muitas informações e truncam o caminho do arquivo para "...". O segundo comando nesta resposta fornece exatamente o que você precisa, funciona em um diretório de arquivos e está formatando de uma maneira que é fácil ver como modificá-lo para retornar outras informações. Basta alterar o .LegalCopyright no comando para .FileVersion.
Dennis

Esta é a versão correta para o .NET EXEs. A resposta de Jaykul não tem a mesma versão.
precisa saber é o seguinte

Na verdade, isso não está certo. Observe get-item C:\Windows\System32\ubpm.dll | % VersionInfo | fl * -forcee compare o FilePrivatePart com a última parte do FileVersion. O FileVersion mostra o que foi originalmente enviado, e não a versão corrigida. Este comando, por outro lado, mostra o número da versão corrigida: (get-command C: \ Windows \ System32 \ ubpm.dll) .Version
Jaykul 14/14/14

Um exemplo melhor seria o C: \ Windows \ System32 \ Lsasrv.dll recentemente corrigido ... mas a verdade é que (Get-Command ... ).Versionretorna a ProductVersion e não a FileVersion , e às vezes isso importa. Portanto, para uma solução completa que realmente retorne a FileVersion atualizada , confira o exemplo Update-TypeData na minha resposta abaixo.
Jaykul

170

Atualmente, você pode obter o FileVersionInfo de Get-Item ou Get-ChildItem, mas ele mostrará o FileVersion original do produto enviado e não a versão atualizada. Por exemplo:

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

Curiosamente, você pode obter a ProductVersion atualizada (corrigida) usando este:

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

A distinção que estou fazendo entre "original" e "corrigido" deve-se basicamente à maneira como a FileVersion é calculada ( consulte os documentos aqui ). Basicamente, desde o Vista, a GetFileVersionInfo da API do Windows está consultando parte das informações da versão do arquivo neutro de idioma (exe / dll) e a parte não corrigida de um arquivo mui específico do idioma (que não é atualizado sempre que os arquivos são alterados) )

Portanto, com um arquivo como lsasrv (que foi substituído devido a problemas de segurança no SSL / TLS / RDS em novembro de 2014), as versões relatadas por esses dois comandos (pelo menos por um tempo após essa data) eram diferentes, e o segundo é o versão mais "correta".

No entanto, embora esteja correto no LSASrv, é possível que a ProductVersion e a FileVersion sejam diferentes (é comum, de fato). Portanto, a única maneira de obter a Fileversion atualizada diretamente do arquivo de montagem é construindo você mesmo a partir das peças, algo como isto:

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

Ou puxando os dados a partir disso:

[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)

Você pode adicionar isso facilmente a todos os objetos FileInfo atualizando o TypeData no PowerShell:

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

Agora, toda vez que você faz Get-ChildItemou Get-Itemterá uma FileVersionpropriedade que mostra a FileVersion atualizada ...


10
E para fazer isso o equivalente à resposta aceita de Lars, basta usar(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
rand0m1

1
Estou intrigado com o Get-Commandaplicado a um arquivo DLL. Você poderia elaborar sobre o seu efeito?
Stephane Rolland

3
Aviso O FileVersionInfo.FileVersion é uma representação de seqüência de caracteres que pode não estar atualizada. Você deve consultar FileVersionInfo.FileMajorPart, FileMinorPart, FileBuildPart, FilePrivatePart. Veja GetFileVersionInfo () retorna as informações de versão do arquivo errado
bdeem

1
@ Jaykul Para esclarecer meu comentário / pergunta anterior: a resposta original demonstra como obter a ProductVersion no PowerShell através de algumas convoluções interessantes, porque a ProductVersion pode ser mais indicativa que a FileVersion. A resposta original não faz menção à propriedade VersionInfo.ProductVersion, possivelmente porque a resposta é anterior a ela. É (Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.ProductVersionuma maneira mais nova e simples de obter as mesmas informações sobre ProductVersion documentadas na resposta? Eu realmente não confio que a Microsoft use o termo de forma ProductVersionconsistente.
Tydaeus 2/08/19

2
@ Tydaeus Não é novidade. Você pode consultá-lo nos documentos e ver até que ponto o problema ocorre (.NET 1.1) 😏. Minha resposta menciona ProductVersion, mas a versão que estamos calculando com todo esse código ScriptProperty é a versão FILE real, não a ProductVersion. Às vezes são os mesmos, mas nem sempre. 😔 E, infelizmente, todos os exemplos do mundo real surgem com alterações na próxima versão de serviço do Windows 😉 docs.microsoft.com/en-us/dotnet/api/…
Jaykul

50

'dir' é um alias para Get-ChildItem que retornará uma classe System.IO.FileInfo quando você a chamar do sistema de arquivos que possui VersionInfo como propriedade. Assim ...

Para obter as informações da versão de um único arquivo, faça o seguinte:

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, isso:

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

É útil incluir outros metadados comuns (como nome e descrição da empresa).
David Faivre

16

Prefiro instalar as extensões da comunidade do PowerShell e apenas usar a função Get-FileVersionInfo que ela fornece.

Igual a:

Get-FileVersionInfo MyAssembly.dll

com saída como:

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

Eu o usei em um diretório inteiro de montagens com grande sucesso.


12

Sei que isso já foi respondido, mas se alguém estiver interessado em digitar menos caracteres, acredito que essa é a maneira mais curta de escrever isso no PS v3 +:

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

O benefício de usar lsdessa maneira é que você pode adaptá-lo facilmente para procurar um determinado arquivo em subpastas. Por exemplo, o comando a seguir retornará informações de versão para todos os arquivos chamados application.exenas subpastas:

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

Você pode refinar ainda mais isso adicionando -ea silentlycontinuepara ignorar coisas como erros de permissão em pastas que não podem ser pesquisadas:

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

Por fim, se você estiver recebendo reticências (...) em seus resultados, poderá anexar | flpara retornar as informações em um formato diferente. Isso retorna muito mais detalhes, embora formatado em uma lista, em vez de uma linha por resultado:

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

Sei que isso é muito parecido com a resposta do xcud lse dirsão os dois pseudônimos de Get-ChildItem. Mas espero que meu método "mais curto" ajude alguém.

O exemplo final pode ser escrito em mão longa da seguinte maneira:

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

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


11

Apenas outra maneira de fazer isso é usar a técnica de acesso a arquivos embutida:

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

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

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

Isso é bem próximo da técnica dir.


(get-item \\ "$ computerName" \ "C $ \ Arquivos de programas \ Symantec AntiVirus \ VPDN_LU.exe"). VersionInfo.FileVersion funcionou para mim. Eu precisava adicionar um nome de computador a partir de um loop.
Tequila

7

Isso é baseado nas outras respostas, mas é exatamente o que eu estava procurando:

(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion

Estou intrigado com o Get-Commandaplicado a um arquivo DLL. Você poderia elaborar sobre o seu efeito (antes mesmo de chamar a propriedade FileVersionInfo)?
Stephane Rolland

arquivos DLL contêm FileVersionInfoapenas como arquivos exe. A aplicação deste comando ao caminho obterá as informações da versão do arquivo!
Noelicus

4
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")

4

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
}

Este é um VBScript?
macetw

1
Não, de powershell
Chriseyre2000

2

Como EBGreen disse, [System.Diagnostics.FileVersionInfo] :: GetVersionInfo (path) funcionará, mas lembre-se de que você também pode obter todos os membros do FileVersionInfo, por exemplo:

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

Você deve poder usar todos os membros do FileVersionInfo documentados aqui, o que lhe dará basicamente tudo o que você poderia desejar sobre o arquivo.


1

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

usando um caminho de compartilhamento com espaços no nome, obtive "A propriedade 'Version' não pode ser encontrada neste objeto. Verifique se a propriedade existe."
AnneTheAgile
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.