Que serait un script PowerShell pour renvoyer des versions du .NET Framework sur une machine?
Ma première hypothèse est quelque chose impliquant WMI. Y a-t-il quelque chose de mieux?
Il devrait s'agir d'une seule ligne pour ne renvoyer que la dernière version pour chaque installation de .NET [sur chaque ligne].
.net
powershell
version
MattUebel
la source
la source
asp.net -v
Réponses:
Si vous comptez utiliser le registre, vous devez recurse pour obtenir la version complète du Framework 4.x. Les réponses précédentes renvoient à la fois le numéro racine de mon système pour .NET 3.0 (où les numéros WCF et WPF, qui sont imbriqués sous 3.0, sont plus élevés - je ne peux pas l'expliquer), et ne parviennent pas à renvoyer quoi que ce soit pour 4.0. .
EDIT: Pour .Net 4.5 et plus, cela a légèrement changé à nouveau, donc il y a maintenant un bel article MSDN ici expliquant comment convertir la valeur Release en un numéro de version .Net, c'est une épave totale de train :-(
Cela me semble correct (notez qu'il produit des numéros de version séparés pour WCF et WPF sur 3.0. Je ne sais pas de quoi il s'agit). Il génère également Client et Full sur 4.0 (si vous les avez tous deux installés):
Sur la base de l'article MSDN, vous pouvez créer une table de recherche et renvoyer le numéro de version du produit marketing pour les versions après 4.5:
En fait, comme je continue à devoir mettre à jour cette réponse, voici un script pour générer le script ci-dessus (avec un peu plus) à partir de la source de démarquage de cette page Web. Cela va probablement casser à un moment donné, donc je garde la copie actuelle ci-dessus.
la source
'^(?!S)\p{L}'
expression régulière et obtient les informations sur la version et la version. Quelle est exactement cette expression régulière essayant de qualifier?PSChildName
est le nom de feuille de la clé de registre.\p{L}
est le caractère quelconque de la catégorie Unicode "lettre".(?!S)
est un regard négatif autour, et^
est le début de la chaîne. Il faut donc commencer par une lettre autre queS
. Donc, si vous considérez uniquement ASCII, c'est la même chose que$_.PSChildName -cmatch '^[A-RT-Za-z]'
(notez le-cmatch
). Il trouve donc des clés dont le nom commence par une lettre autre queS
. Je n'ai aucune idée de la raison pour laquelle vous vous souciez du non-ASCII si vous filtrez les noms commençant parS
... Certainement avec vous, c'est si déroutant.Get-ItemProperty -name Version,Release -EA 0
fait. Je sais que-EA 0
c'est la même chose que-ErrorAction SilentlyContinue
, mais quel effet auraitGet-ItemProperty -name Version,Release
-il en lui transmettant tous les résultats? Il ne semble pas supprimer les variables de l'objet, car d'autres sont utilisées dans les commandes ultérieures du pipeline. Exécute-t-il une erreur lorsque le nomVersion
ouRelease
est absent de la clé, puis transmet les objets là où il a réussi à la commande suivante du pipeline?(?!S)
clause pour(?![SW])
exclure davantage les entrées "Windows *". Cela peut également être fait(?=[vCF])
car les seules clés qui nous intéressent vraiment sont les racines de la version et les clés "Complète" et "Client" pour .NET 4.0+. ;)Cette réponse ne renvoie pas 4.5 si cela est installé. La réponse ci-dessous de @Jaykul et l'utilisation de recurse le font.
la source
Ajout du support v4.8 au script:
la source
Vous donne une instance de
Version
pour le CLR que la copie actuelle de PSH utilise (comme documenté ici ).la source
$PSVersionTable
pour rechercher la version du CLR PowerShell sur lequel s'exécute.Syntaxe correcte:
La
GetSystemVersion
fonction renvoie une chaîne comme celle-ci:ou comme ça
$PSVersionTable
est un objet en lecture seule. La propriété CLRVersion est un numéro de version structuré comme celui-ci:la source
J'ai trouvé cela grâce à la complétion des onglets dans PowerShell pour osx:
[System.Runtime.InteropServices.RuntimeInformation]::get_FrameworkDescription() .NET Core 4.6.25009.03
la source
[version]([Runtime.InteropServices.RuntimeInformation]::FrameworkDescription -replace '^.[^\d.]*','')
Il n'y a pas de moyen fiable de le faire pour toutes les plates-formes et architectures à l'aide d'un simple script. Si vous souhaitez apprendre à le faire de manière fiable, commencez par le billet de blog Exemple de code de détection .NET Framework mis à jour qui effectue une vérification plus approfondie .
la source
Reportez-vous à la page Script pour savoir quelles versions de .NET sont installées sur les postes de travail distants .
Le script peut être utile pour trouver la version .NET de plusieurs machines sur un réseau.
la source
Belle solution
Essayez d'utiliser le module téléchargeable DotNetVersionLister (basé sur les informations du registre et une table de recherche de version à version marketing).
Qui serait utilisé comme ceci:
Ou comme ceci si vous voulez juste le tester pour un framework .NET> = 4. * :
Mais cela ne fonctionnera pas (installation / importation) par exemple avec PS v2.0 ( Win 7 , norme Win Server 2010 ) en raison d'incompatibilité ...
Motivation pour les fonctions «héritées» ci-dessous
(Vous pouvez sauter la lecture de ceci et utiliser le code ci-dessous)
Nous avons dû travailler avec PS 2.0 sur certaines machines et n'avons pas pu installer / importer le DotNetVersionLister ci-dessus .
Sur d'autres machines, nous voulions mettre à jour (à partir de PS 2.0 ) vers PS 5.1 (qui à son tour nécessite .NET Framework> = 4.5 ) à l'aide de deux fichiers personnalisés
Install-DotnetLatestCompany
etInstall-PSLatestCompany
.Pour bien guider les administrateurs tout au long du processus d'installation / de mise à jour, nous devrons déterminer la version .NET dans ces fonctions sur toutes les machines et versions PS existantes.
Ainsi, nous avons également utilisé les fonctions ci-dessous pour les déterminer de manière plus sûre dans tous les environnements ...
Fonctions pour les anciens environnements PS (par exemple PS v2.0 )
Ainsi, le code suivant et les exemples d'utilisation ci-dessous (extraits) sont utiles ici (basés sur d'autres réponses ici):
Exemple d'utilisation:
la source
(Get-DotNetVersion -LocalHost -nosummary).">=4.x"
Pas beau. Certainement pas joli:
Cela peut ou non fonctionner. Mais en ce qui concerne la dernière version, cela devrait être assez fiable, car il y a essentiellement des dossiers vides pour les anciennes versions (1.0, 1.1) mais pas pour les plus récentes - ceux-ci n'apparaissent qu'une fois le framework approprié installé.
Pourtant, je soupçonne qu'il doit y avoir un meilleur moyen.
la source
ls $Env:windir\Microsoft.NET\Framework | ? { $_.PSIsContainer -and $_.Name -match '^v\d.[\d\.]+' } | % { $_.Name.TrimStart('v') }
Si vous avez installé Visual Studio sur votre ordinateur, ouvrez l'invite de commande Visual Studio Developer et tapez la commande suivante: clrver
Il répertorie toutes les versions installées de .NET Framework sur cette machine.
la source
Voici mon avis sur cette question à la suite de la documentation msft :
Cet exemple fonctionne avec toutes les versions de PowerShell et fonctionnera à perpétuité car 4.8 est la dernière version de .NET Framework.
la source
Voici l'idée générale:
Obtenez les éléments enfants dans le répertoire .NET Framework qui sont des conteneurs dont les noms correspondent au modèle v number dot number . Triez-les par nom décroissant, prenez le premier objet et renvoyez sa propriété name.
Voici le script:
la source
J'essaierais celui-ci dans PowerShell: a fonctionné pour moi!
(Get-ItemProperty "HKLM: Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full"). Version
la source
Je ne suis pas au courant de ma syntaxe PowerShell, mais je pense que vous pouvez simplement appeler System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion () . Cela renverra la version sous forme de chaîne (quelque chose comme
v2.0.50727
, je pense).la source
[System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion()
:, mais elle renvoie simplement la v4.0.30319, même si la v4.6 est installée dans mon cas.Ceci est un dérivé de l'article précédent, mais cela obtient la dernière version du framework .net 4 dans mes tests.
Ce qui vous permettra d'invoquer la commande sur une machine distante:
Ce qui met en place cette possibilité avec ADModule et le préfixe de convention de dénomination:
la source