Was wäre ein PowerShell-Skript, um Versionen von .NET Framework auf einem Computer zurückzugeben?
Meine erste Vermutung betrifft WMI. Gibt es etwas besseres?
Es sollte ein Einzeiler sein, für jede Installation von .NET [in jeder Zeile] nur die neueste Version zurückzugeben.
.net
powershell
version
MattUebel
quelle
quelle
asp.net -v
Antworten:
Wenn Sie die Registrierung verwenden möchten, müssen Sie einen Rekurs durchführen, um die Vollversion für das 4.x Framework zu erhalten. Die früheren Antworten geben beide die Stammnummer auf meinem System für .NET 3.0 zurück (wobei die WCF- und WPF-Nummern, die unter 3.0 verschachtelt sind, höher sind - das kann ich nicht erklären) und geben für 4.0 nichts zurück. .
BEARBEITEN: Für .Net 4.5 und höher hat sich dies wieder leicht geändert, daher gibt es hier jetzt einen schönen MSDN-Artikel, in dem erklärt wird, wie das Release konvertiert wird Wert in eine .Net-Versionsnummer wird. Es handelt sich um ein totales Zugunglück :-(
Das sieht für mich richtig aus (beachten Sie, dass es separate Versionsnummern für WCF & WPF unter 3.0 ausgibt. Ich weiß nicht, worum es geht). Es gibt auch sowohl Client als auch Full unter 4.0 aus (wenn Sie beide installiert haben):
Basierend auf dem MSDN-Artikel können Sie eine Nachschlagetabelle erstellen und die Versionsnummer des Marketingprodukts für Releases nach 4.5 zurückgeben:
Da ich diese Antwort ständig aktualisieren muss, finden Sie hier ein Skript zum Generieren des obigen Skripts (mit einem kleinen Extra) aus der Markdown-Quelle für diese Webseite. Dies wird wahrscheinlich irgendwann kaputt gehen, also behalte ich die aktuelle Kopie oben.
quelle
'^(?!S)\p{L}'
regulären Ausdruck passt, und ruft die Versions- und Versionsinformationen ab. Was genau versucht dieser reguläre Ausdruck zu qualifizieren?PSChildName
ist der Blattname des Registrierungsschlüssels.\p{L}
ist ein beliebiges Zeichen in der Unicode-Kategorie "Buchstabe".(?!S)
ist ein negativer Blick und^
ist der Anfang der Zeichenfolge. Es muss also mit einem anderen Buchstaben als beginnenS
. Wenn Sie also nur ASCII berücksichtigen, ist dies dasselbe wie$_.PSChildName -cmatch '^[A-RT-Za-z]'
(beachten Sie das-cmatch
). Es werden also Schlüssel gefunden, bei denen der Name mit einem anderen Buchstaben als beginntS
. Ich habe keine Ahnung, warum Sie sich für Nicht-ASCII interessieren, wenn Sie Namen herausfiltern, die mitS
... beginnen. Auf jeden Fall, weil Sie so verwirrend sind.Get-ItemProperty -name Version,Release -EA 0
tut. Ich weiß,-EA 0
ist das gleiche wie-ErrorAction SilentlyContinue
, aber wie würdeGet-ItemProperty -name Version,Release
sich das auswirken , wenn alle Ergebnisse darauf übertragen würden? Es scheint keine Variablen vom Objekt zu entfernen, da andere in späteren Befehlen in der Pipeline verwendet werden. Wird es ausgeführt, tritt ein Fehler auf, wenn der NameVersion
oderRelease
im Schlüssel fehlt, und übergibt dann Objekte, bei denen dies erfolgreich war, an den nächsten Befehl in der Pipeline?(?!S)
Klausel nur so geändert, dass die(?![SW])
Einträge "Windows *" weiter ausgeschlossen werden. Dies ist auch möglich,(?=[vCF])
da die einzigen Schlüssel, die uns wirklich wichtig sind, die Versionswurzeln sowie die Schlüssel "Voll" und "Client" für .NET 4.0+ sind. ;)Diese Antwort gibt nicht 4.5 zurück, wenn das installiert ist. Die Antwort unten von @Jaykul und die Verwendung von recurse tut es.
quelle
Unterstützung für v4.8 zum Skript hinzugefügt:
quelle
Gibt Ihnen eine Instanz
Version
für die CLR, die die aktuelle Kopie von PSH verwendet (wie hier dokumentiert ).quelle
$PSVersionTable
die Version der CLR ermitteln, auf der PowerShell ausgeführt wird.Richtige Syntax:
Die
GetSystemVersion
Funktion gibt eine Zeichenfolge wie folgt zurück:oder so
$PSVersionTable
ist ein schreibgeschütztes Objekt. Die CLRVersion-Eigenschaft ist eine strukturierte Versionsnummer wie folgt:quelle
Ich fand dies durch Tab-Vervollständigung in Powershell für Osx:
[System.Runtime.InteropServices.RuntimeInformation]::get_FrameworkDescription() .NET Core 4.6.25009.03
quelle
[version]([Runtime.InteropServices.RuntimeInformation]::FrameworkDescription -replace '^.[^\d.]*','')
Es gibt keine zuverlässige Möglichkeit, dies für alle Plattformen und Architekturen mithilfe eines einfachen Skripts zu tun. Wenn Sie lernen möchten, wie dies zuverlässig funktioniert, beginnen Sie mit dem Blogbeitrag. Aktualisierter Beispiel-.NET Framework-Erkennungscode, der eine eingehendere Überprüfung durchführt .
quelle
Auf der Seite Skript finden Sie Informationen dazu , welche .NET-Versionen auf Remote-Workstations installiert sind .
Das dortige Skript kann hilfreich sein, um die .NET-Version für mehrere Computer in einem Netzwerk zu finden.
quelle
Schöne Lösung
Versuchen Sie es mit dem herunterladbaren DotNetVersionLister- Modul (basierend auf Registrierungsinformationen und einer Nachschlagetabelle von Version zu Marketing-Version).
Welches würde so verwendet werden:
Oder so, wenn Sie es nur für ein .NET Framework testen möchten > = 4. * :
Aber es wird nicht funktionieren (installieren / importieren), zB mit PS v2.0 ( Win 7 , Win Server 2010 Standard) wegen Inkompatibilität ...
Motivation für "Legacy" -Funktionen unten
(Sie können das Lesen überspringen und den folgenden Code verwenden.)
Wir mussten auf einigen Computern mit PS 2.0 arbeiten und konnten den obigen DotNetVersionLister nicht installieren / importieren .
Auf anderen Computern wollten wir (von PS 2.0 ) auf PS 5.1 (das wiederum .NET Framework> = 4.5 benötigt ) mit Hilfe von zwei firmeneigenen
Install-DotnetLatestCompany
und aktualisierenInstall-PSLatestCompany
.Um Administratoren gut durch den Installations- / Aktualisierungsprozess zu führen, müssten wir die .NET-Version in diesen Funktionen auf allen vorhandenen Computern und PS-Versionen ermitteln.
Daher haben wir auch die folgenden Funktionen verwendet, um sie in allen Umgebungen sicherer zu bestimmen ...
Funktionen für ältere PS-Umgebungen (z. B. PS v2.0 )
Der folgende Code und die folgenden (extrahierten) Verwendungsbeispiele sind hier nützlich (basierend auf anderen Antworten hier):
Anwendungsbeispiel:
quelle
(Get-DotNetVersion -LocalHost -nosummary).">=4.x"
Nicht hübsch. Auf jeden Fall nicht schön:
Dies kann funktionieren oder nicht. Für die neueste Version sollte dies jedoch ziemlich zuverlässig sein, da es im Wesentlichen leere Ordner für alte Versionen (1.0, 1.1) gibt, aber keine neueren - diese werden erst angezeigt, wenn das entsprechende Framework installiert ist.
Trotzdem vermute ich, dass es einen besseren Weg geben muss.
quelle
ls $Env:windir\Microsoft.NET\Framework | ? { $_.PSIsContainer -and $_.Name -match '^v\d.[\d\.]+' } | % { $_.Name.TrimStart('v') }
Wenn Sie Visual Studio auf Ihrem Computer installiert haben, öffnen Sie die Eingabeaufforderung für Visual Studio Developer und geben Sie den folgenden Befehl ein: clrver
Es werden alle auf diesem Computer installierten Versionen von .NET Framework aufgelistet.
quelle
Hier ist meine Meinung zu dieser Frage gemäß der MSFT-Dokumentation :
Dieses Beispiel funktioniert mit allen PowerShell-Versionen und funktioniert auf Dauer, da 4.8 die letzte .NET Framework-Version ist.
quelle
Hier ist die allgemeine Idee:
Rufen Sie untergeordnete Elemente im .NET Framework-Verzeichnis ab, bei denen es sich um Container handelt, deren Namen mit der Punktnummer des Musters v übereinstimmen . Sortieren Sie sie nach absteigendem Namen, nehmen Sie das erste Objekt und geben Sie die Eigenschaft name zurück.
Hier ist das Skript:
quelle
Ich würde dieses in PowerShell versuchen: Arbeitete für mich!
(Get-ItemProperty "HKLM: Software \ Microsoft \ NET Framework-Setup \ NDP \ v4 \ Full"). Version
quelle
Ich bin mit meiner PowerShell-Syntax nicht vertraut , aber ich denke, Sie könnten einfach System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion () aufrufen. . Dies gibt die Version als Zeichenfolge zurück (so etwas wie
v2.0.50727
, denke ich).quelle
[System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion()
, aber es wird nur v4.0.30319 zurückgegeben, obwohl in meinem Fall v4.6 installiert ist.Dies ist ein Derivat des vorherigen Beitrags, aber dies bringt die neueste Version des .net Framework 4 in meinen Tests.
Damit können Sie den Befehl auf dem Remote-Computer aufrufen:
Was diese Möglichkeit mit ADModule und Namenskonventionspräfix einrichtet:
quelle