2010-07-16 2 views
31

Je voudrais pouvoir obtenir la version de fichier et la version d'assemblage de tous les fichiers DLL dans un répertoire et dans tous ses sous-répertoires. Je suis novice en programmation et je n'arrive pas à comprendre comment faire fonctionner cette boucle.Obtenir la version de fichier et la version d'assemblage des fichiers DLL dans le répertoire courant et tous les sous-répertoires

Je possède ce code PowerShell pour obtenir la version de montage (tiré d'un forum):

$strPath = 'c:\ADMLibrary.dll' 
$Assembly = [Reflection.Assembly]::Loadfile($strPath) 

$AssemblyName = $Assembly.GetName() 
$Assemblyversion = $AssemblyName.version 

Et cela aussi:

$file = Get-ChildItem -recurse | %{ $_.VersionInfo } 

Comment puis-je faire une boucle de cette façon que je peux retourner la version d'assemblage de tous les fichiers dans un répertoire?

Répondre

26

En tant que one-liner laid:

Get-ChildItem -Filter *.dll -Recurse | 
    ForEach-Object { 
     try { 
      $_ | Add-Member NoteProperty FileVersion ($_.VersionInfo.FileVersion) 
      $_ | Add-Member NoteProperty AssemblyVersion (
       [Reflection.AssemblyName]::GetAssemblyName($_.FullName).Version 
      ) 
     } catch {} 
     $_ 
    } | 
    Select-Object Name,FileVersion,AssemblyVersion 

Si vous souhaitez que le répertoire courant, puis laissez évidemment le paramètre -Recurse. Si vous voulez tous les fichiers au lieu de simplement les DLL, supprimez le paramètre -Filter et son argument. Le code est (espérons-le) assez simple. Je suggérerais de faire tourner les parties désagréables du bloc try dans des fonctions séparées, car cela rendrait la gestion des erreurs moins pénible ici.

Exemple de sortie:

Name         FileVersion  AssemblyVersion 
----         -----------  --------------- 
Properties.Resources.Designer.cs.dll 0.0.0.0   0.0.0.0 
My Project.Resources.Designer.vb.dll 0.0.0.0   0.0.0.0 
WindowsFormsControlLibrary1.dll   1.0.0.0   1.0.0.0 
WindowsFormsControlLibrary1.dll   1.0.0.0   1.0.0.0 
WindowsFormsControlLibrary1.dll   1.0.0.0   1.0.0.0 
+0

Cela fonctionne, mais malheureusement, il charge les fichiers et ne les libère ... Exécuter et puis essayer de supprime un de ces fichiers. –

+1

C'est en effet un inconvénient. Vous pouvez contourner ceci en générant une nouvelle instance de PowerShell: 'powershell -NoProfile -OutputFormat XML -EncodedCommand $ encodedCommand |% {$ _}' avec $ encodedCommand étant la variante codée en Base64 de l'extrait ci-dessus (voir 'powershell /? 'pour un échantillon comment l'obtenir). Cela donnera les mêmes objets qui seraient autrement produits, mais le shell qui charge les fichiers n'est plus en vie maintenant. – Joey

+0

J'essaye de charger les assemblys dans le nouveau AppDomain et de le décharger plus tard, mais cela ne fonctionne pas - le chargeur d'assembly recherche des assemblys dans le répertoire PowerShell (C: /windows/system32/WindowsPowerShell/v1.0) même si je mets le répertoire de base lors de la création du nouveau domaine ... –

47

Voici une jolie doublure:

Get-ChildItem -Filter *.dll -Recurse | Select-Object -ExpandProperty VersionInfo 

En bref pour la version PowerShell 2:

ls -fi *.dll -r | % { $_.versioninfo } 

En bref pour la version PowerShell 3 comme l'a suggéré par tamasf:

ls *.dll -r | % versioninfo 
+6

En bref: ls * .dll -r | % versioninfo – tamasf

+4

Cela ne donnera que le FileVersion mais pas le AssemblyVersion – bitbonk

+0

Pour les DLLs gérées, pour obtenir les informations de version réelles/mises à jour, .NET est vraiment la seule façon de procéder. http://elegantcode.com/2009/12/22/powershell-load-assembly-without-locking-file/ Regardez la "mise à jour" ci-dessous, le reste est trop compliqué: p –

1

est ici un joli one-liner:

Get-ChildItem -Filter *.dll -Recurse | ForEach-Object ` 
{ 
    return [PSCustomObject]@{ 
     Name = $_.Name 
     FileVersion = $_.VersionInfo.FileVersion 
     AssemblyVersion = ([Reflection.AssemblyName]::GetAssemblyName($_.FullName).Version) 
    } 
} 

Exemple de sortie:

Name   FileVersion AssemblyVersion 
----   ----------- --------------- 
Minimatch.dll 1.1.0.0  1.1.0.0 
VstsTaskSdk.dll 1.0.0.0  1.0.0.0 
Questions connexes