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.
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:
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 * -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
(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.
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 ...
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Get-Commandaplicado a um arquivo DLL. Você poderia elaborar sobre o seu efeito?
(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.
'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-Objectversioninfo 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 -RecurseVocê 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 -ErrorActionPor 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-ListSei 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).
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-Commandaplicado a um arquivo DLL. Você poderia elaborar sobre o seu efeito (antes mesmo de chamar a propriedade FileVersionInfo)?
FileVersionInfoapenas 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