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?
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
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
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
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
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
.