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.
file
powershell
versioninfo
Imperador XLII
fonte
fonte
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:
Curiosamente, você pode obter a ProductVersion atualizada (corrigida) usando este:
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:
Ou puxando os dados a partir disso:
Você pode adicionar isso facilmente a todos os objetos FileInfo atualizando o TypeData no PowerShell:
Agora, toda vez que você faz
Get-ChildItem
ouGet-Item
terá umaFileVersion
propriedade que mostra a FileVersion atualizada ...fonte
(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 formaProductVersion
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:
Para vários arquivos, isso:
fonte
Prefiro instalar as extensões da comunidade do PowerShell e apenas usar a função Get-FileVersionInfo que ela fornece.
Igual a:
com saída como:
Eu o usei em um diretório inteiro de montagens com grande sucesso.
fonte
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
é um apelido paraGet-ChildItem
%
é um apelido paraForEach-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 chamadosapplication.exe
nas subpastas:-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:-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:fl
é um apelido paraFormat-List
Sei que isso é muito parecido com a resposta do xcud
ls
edir
são os dois pseudônimos deGet-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:
... mas acho que meu caminho é mais legal e, para alguns, mais fácil de lembrar. (Mas principalmente mais frio).
fonte
Apenas outra maneira de fazer isso é usar a técnica de acesso a arquivos embutida:
Você também pode obter qualquer propriedade específica do VersionInfo, assim:
Isso é bem próximo da técnica dir.
fonte
Isso é baseado nas outras respostas, mas é exatamente o que eu estava procurando:
fonte
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!fonte
Acho isso útil:
fonte
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:
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.
fonte
Aqui um método alternativo. Ele usa Get-WmiObject CIM_DATAFILE para selecionar a versão.
fonte