Question

Comment pouvez-vous obtenir les informations de version à partir d'un .dll ou .exe fichier en 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.

Était-ce utile?

La solution

Puisque PowerShell peut appeler .FILET cours, vous pouvez 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 plus sympa comme script : http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!125.entry

Autres conseils

De nos jours, vous pouvez obtenir FileVersionInfo à partir de Get-Item ou Get-ChildItem, mais il affichera la FileVersion originale du produit expédié, et non la version mise à jour.Par exemple:

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

Fait intéressant, vous pouvez obtenir la version mise à jour (corrigée) Version de produit en utilisant ceci :

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

Notez qu'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 sont différentes, et le deuxième est la bonne version.

Cependant, bien que ce soit correct dans LSASrv, il est possible que ProductVersion et FileVersion soient différents (c'est courant, en fait).Donc la seule façon d'obtenir le mis à jour Fileversion consiste à le créer vous-même, quelque chose comme ceci :

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

Ou plutôt, comme ceci :

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 tu le fais Get-ChildItem ou Get-Item tu auras un FileVersion propriété qui affiche la FileVersion mise à jour...

'dir' est un alias pour Get-ChildItem qui renverra une classe System.IO.FileInfo lorsque vous l'appelez à partir du 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 plusieurs fichiers, 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

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

Ainsi:

Get-FileVersionInfo MyAssembly.dll

avec une sortie comme :

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

Je l'ai utilisé sur tout un répertoire d'assemblys avec beaucoup de succès.

Une autre façon de procéder consiste à utiliser la technique d'accès aux fichiers intégrée :

(get-item .\filename.exe).VersionInfo | FL

Vous pouvez également extraire n'importe quelle propriété particulière de VersionInfo, ainsi :

(get-item .\filename.exe).VersionInfo.FileVersion

C'est assez proche de la technique du dir.

Je me rends compte que cette question a déjà reçu une réponse, mais si quelqu'un souhaite taper moins de caractères, je pense que c'est le moyen le plus court d'écrire ceci dans PS v3+ :

ls application.exe | % versioninfo
  • ls est un pseudonyme pour Get-ChildItem
  • % est un pseudonyme pour ForEach-Object
  • versioninfo voici une façon abrégée d'écrire {$_.VersionInfo}

L'avantage d'utiliser ls de cette façon, vous pouvez facilement l'adapter pour rechercher un fichier donné dans des sous-dossiers.Par exemple, la commande suivante renverra les informations de version pour tous les fichiers appelés application.exe dans les sous-dossiers :

ls application.exe -r | % versioninfo
  • -r est un pseudonyme pour -Recurse

Vous pouvez affiner cela en ajoutant -ea silentlycontinue pour ignorer des éléments tels que les erreurs d'autorisation dans les dossiers dans lesquels vous ne pouvez pas rechercher :

ls application.exe -r -ea silentlycontinue | % versioninfo
  • -ea est un pseudonyme pour -ErrorAction

Enfin, si vous obtenez des points de suspension (...) dans vos résultats, vous pouvez ajouter | fl pour renvoyer les informations dans un format différent.Cela renvoie beaucoup plus de détails, bien que formatés sous forme de liste, plutôt que sur une ligne par résultat :

ls application.exe -r -ea silentlycontinue | % versioninfo | fl
  • fl est un pseudonyme pour Format-List

Je me rends compte que c'est très similaire à la réponse de xcud en ce sens ls et dir sont tous deux des pseudonymes pour Get-ChildItem.Mais j'espère que ma méthode "la plus courte" aidera quelqu'un.

Le dernier exemple pourrait être écrit à la main de la manière suivante :

Get-ChildItem -Filter application.exe -Recurse -ErrorAction SilentlyContinue | ForEach-Object {$_.VersionInfo} | Format-List

...mais je pense que ma façon de faire est plus cool et, pour certains, plus facile à retenir.(Mais surtout plus cool).

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

(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")

Je trouve ça utile :

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
}

Comme l'a dit EBGreen, [System.Diagnostics.FileVersionInfo]::GetVersionInfo(path) fonctionnera, mais rappelez-vous que vous pouvez également obtenir tous les membres de FileVersionInfo, par exemple :

[System.Diagnostics.FileVersionInfo]::GetVersionInfo(path).CompanyName

Vous devriez pouvoir utiliser tous les membres de FileVersionInfo documentés ici, ce qui vous donnera essentiellement tout ce que vous pourriez souhaiter à propos du fichier.

Voici une méthode alternative.Il utilise Get-WmiObject CIM_DATAFILE pour sélectionner la version.

(Get-WmiObject -Class CIM_DataFile -Filter "Name='C:\\Windows\\explorer.exe'" | Select-Object Version).Version
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top