174 votes

Obtenir la version d'un fichier en PowerShell

Comment obtenir les informations de version d'un .dll o .exe dans PowerShell ?

Je suis particulièrement intéressé par File Version bien que d'autres informations sur la version (c'est-à-dire, Company , Language , Product Name etc.) serait également utile.

209voto

Jaykul Points 6484

Aujourd'hui, vous pouvez obtenir l'information sur la version du fichier à partir de Get-Item ou Get-ChildItem, mais elle affichera la version originale du fichier du produit livré, et non la version mise à jour. Par exemple :

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

Il est intéressant de noter que vous pouvez obtenir la mise à jour (patchée) Version du produit en utilisant ceci :

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

La distinction que je fais entre "original" et "patché" est essentiellement due à la façon dont la FileVersion est calculée ( voir les documents ici ). En gros, depuis Vista, l'API Windows GetFileVersionInfo interroge une partie des informations de version à partir du fichier neutre pour la langue (exe/dll) et la partie non fixée à partir d'un fichier mui spécifique à la langue (qui n'est pas mis à jour à chaque fois que les fichiers changent).

Ainsi, avec un fichier comme lsasrv (qui a été remplacé en raison de problèmes de sécurité dans SSL/TLS/RDS en novembre 2014), les versions signalées par ces deux commandes (au moins pendant un certain temps après cette date) étaient différentes, et la commande. le deuxième est la version la plus "correcte".

Cependant, bien que cela soit correct dans LSASrv, il est possible que la ProductVersion et la FileVersion soient différentes (c'est courant, en fait). Ainsi, la seule façon d'obtenir la actualisé Fileversion directement à partir du fichier d'assemblage est de le construire vous-même à partir des pièces, quelque chose comme ceci :

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

Ou en tirant les données de ceci :

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

Vous pouvez facilement ajouter cela à tous les objets FileInfo en mettant à jour le TypeData dans PowerShell :

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

Maintenant, à chaque fois que vous faites Get-ChildItem o Get-Item vous aurez un FileVersion qui montre la version mise à jour de FileVersion ...

10 votes

Et pour que cela soit l'équivalent de la réponse acceptée par Lars, utilisez simplement (Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion

2 votes

Je suis intriguée par le Get-Command appliquée à un fichier dll. Pouvez-vous nous en dire plus sur son effet ?

0 votes

Eh bien, à l'époque, le FileInfo n'avait pas de ScriptProperty "VersionInfo" comme aujourd'hui, mais l'objet ApplicationInfo renvoyé par Get-Command comprenait un ScriptProperty "FileVersionInfo" (qui est le même que le VersionInfo qui se trouve sur les objets FileInfo dans les nouvelles versions de PowerShell).

171voto

Lars Truijens Points 24005

Puisque PowerShell peut appeler .NET vous pourriez faire ce qui suit :

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

Ou comme noté ici sur une liste de fichiers :

get-childitem * -include *.dll,*.exe | foreach-object { "{0}`t{1}" -f $_.Name, [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_).FileVersion }

Ou encore mieux comme un script : https://jtruher3.wordpress.com/2006/05/14/powershell-and-file-version-information/

9 votes

Voir @Jaykul pour une solution qui ne nécessite pas d'objet .NET. À mon avis, la réponse de Jaykul aurait dû être sélectionnée comme réponse :)

3 votes

Bien que les autres réponses donnent des commandes plus courtes, toutes celles que j'ai essayées affichent trop d'informations et tronquent le chemin du fichier en "...". La deuxième commande de cette réponse donne exactement ce dont vous avez besoin, fonctionne pour un répertoire de fichiers, et est formatée de telle manière qu'il est facile de voir comment la modifier pour retourner d'autres informations. Changez simplement le .LegalCopyright de la commande en .FileVersion.

0 votes

C'est la version correcte pour les .NET EXEs. La réponse de Jaykul n'obtient pas la même version.

56voto

xcud Points 6878

Dir' est un alias pour Get-ChildItem qui renverra une classe System.IO.FileInfo si vous l'appelez depuis le système de fichiers qui a VersionInfo comme propriété. Donc ...

Pour obtenir les informations de version d'un seul fichier, procédez comme suit :

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     :

Pour les fichiers multiples, ceci :

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

16voto

David Mohundro Points 5158

Je préfère installer le Extensions communautaires PowerShell et utiliser simplement la fonction Get-FileVersionInfo qu'il fournit.

Comme ça :

Get-FileVersionInfo MyAssembly.dll

avec des résultats comme :

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

Je l'ai utilisé contre un répertoire entier d'assemblages avec un grand succès.

8voto

noelicus Points 3788

C'est basé sur sur les autres réponses, mais c'est exactement ce que je cherchais :

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

0 votes

Je suis intriguée par le Get-Command appliquée à un fichier dll. Pourriez-vous nous en dire plus sur son effet (avant même d'appeler la propriété FileVersionInfo) ?

0 votes

Les fichiers dll contiennent FileVersionInfo tout comme les fichiers exe. En appliquant cette commande au chemin, vous obtiendrez des informations sur la version du fichier !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X