Como você pode obter as informações da versão de um arquivo .dll
ou .exe
no PowerShell?
Estou especialmente interessado em File Version
, embora outras informações versão (isto é, Company
, Language
, Product Name
, etc.) seria útil também.
Como você pode obter as informações da versão de um arquivo .dll
ou .exe
no PowerShell?
Estou especialmente interessado em File Version
, embora outras informações versão (isto é, Company
, Language
, Product Name
, etc.) seria útil também.
Respostas:
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/
get-item C:\Windows\System32\ubpm.dll | % VersionInfo | fl * -force
e 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
(Get-Command ... ).Version
retorna 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.
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-ChildItem
ou Get-Item
terá uma FileVersion
propriedade que mostra a FileVersion atualizada ...
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Get-Command
aplicado a um arquivo DLL. Você poderia elaborar sobre o seu efeito?
(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.ProductVersion
uma 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 ProductVersion
consistente.
'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
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.
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 ls
dessa 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.exe
nas subpastas:
ls application.exe -r | % versioninfo
-r
é um apelido para -Recurse
Você pode refinar ainda mais isso adicionando -ea silentlycontinue
para 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 | fl
para 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 ls
e dir
sã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).
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.
Isso é baseado nas outras respostas, mas é exatamente o que eu estava procurando:
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Get-Command
aplicado a um arquivo DLL. Você poderia elaborar sobre o seu efeito (antes mesmo de chamar a propriedade FileVersionInfo)?
FileVersionInfo
apenas como arquivos exe. A aplicação deste comando ao caminho obterá as informações da versão do arquivo!
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, [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.
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