Obter versão do arquivo no PowerShell
-
09-06-2019 - |
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.
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 paraGet-ChildItem
%
é um alias paraForEach-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 paraFormat-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