web-dev-qa-db-fra.com

Obtenir la version du fichier et la version d'assemblage de DLL fichiers dans le répertoire en cours et tous les sous-répertoires

J'aimerais pouvoir obtenir la version du fichier et la version de tous les fichiers DLL dans un répertoire et tous ses sous-répertoires. Je suis novice en programmation et je ne vois pas comment faire fonctionner cette boucle.

J'ai ce code PowerShell pour obtenir la version Assembly (extraite d'un forum):

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

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

Et ceci aussi:

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

Comment puis-je créer une boucle afin de pouvoir renvoyer la version Assembly de tous les fichiers d'un répertoire?

38
Tim Sloyan

Voici un joli one liner:

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

En bref pour PowerShell version 2:

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

En bref pour PowerShell version 3 comme suggéré par tamasf :

ls *.dll -r | % versioninfo
56
knut

Comme un vilain liner:

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 ne voulez que le répertoire en cours, alors évidemment, laissez de côté le paramètre -Recurse. Si vous voulez que tous les fichiers soient remplacés par des DLL uniquement, supprimez le paramètre -Filter et son argument. Le code est (espérons-le) assez simple.

Je vous suggérerais de décomposer les parties désagréables du bloc try en fonctions distinctes, car la gestion des erreurs en sera simplifiée.

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
32
Joey

Voici 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
2
Dmitry Serbin

Laisser Select-Object créer les propriétés

Get-ChildItem -Filter *.dll -Recurse | Select-Object Name,@{n='FileVersion';e={$_.VersionInfo.FileVersion}},@{n='AssemblyVersion';e={[Reflection.AssemblyName]::GetAssemblyName($_.FullName).Version}}

Et la sortie d'échantillon est similaire

Name                                           FileVersion AssemblyVersion
----                                           ----------- ---------------
CI.EntityFramework.Initialization.dll          1.0.0.0     1.0.0.0
Castle.Core.dll                                3.3.0.43    3.3.0.0
Castle.Windsor.dll                             3.3.0.51    3.3.0.0
Mutare.VitalLink.dll                           1.0.0.0     1.0.0.0
Newtonsoft.Json.dll                            9.0.1.19813 9.0.0.0
1
Jim W

Basé sur la réponse de Joey, mais exploitant un comportement pratique pour la gestion des exceptions implicites. Commencez par ajouter une propriété d'extension:

Update-TypeData -TypeName System.IO.FileInfo -MemberType ScriptProperty -MemberName AssemblyVersion -Value { [Reflection.AssemblyName]::GetAssemblyName($this.FullName).Version }

Cela peut éventuellement être placé dans votre profil pour une réutilisation. Ensuite, la sélection réelle est juste, par exemple.

Get-ChildItem -Filter *.dll -Recurse | Select-Object Name,AssemblyVersion

En note de bas de page, la principale raison pour laquelle je poste ceci comme réponse supplémentaire est dans l'intérêt de noobs PowerShell comme moi: il m'a fallu beaucoup de temps pour comprendre que $_ dans la réponse de Joey doit être transformé en $this dans la définition donnée à Update-TypeData.

0
Peter Taylor