PowerShell-Skript zum Zurückgeben von Versionen von .NET Framework auf einem Computer?

182

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.

MattUebel
quelle
7
Eine Maschine kann (und wird) mehrere Versionen des Fx haben. Wie wollen Sie damit umgehen? Und dann ist da noch das Fx2 .. Fx3.5SP1-Chaos. Welche Version möchten Sie hören?
Henk Holterman
Ich nehme an, es wäre notwendig, die vollständige Versionsnummer für jede Installation zurückzugeben.
MattUebel
1
Gibt es keine Möglichkeit, dies über WMI zu tun?
Mark Richman
Sie haben nach PowerShell gefragt, ich habe etwas für C # (Konsolenanwendung) erstellt. Wenn Sie interessiert sind, hier ist es ...
Matt
Es ist wirklich unglaublich, dass es so etwas nicht gibt:asp.net -v
Altimus Prime

Antworten:

353

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):

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -recurse |
Get-ItemProperty -name Version,Release -EA 0 |
Where { $_.PSChildName -match '^(?!S)\p{L}'} |
Select PSChildName, Version, Release

Basierend auf dem MSDN-Artikel können Sie eine Nachschlagetabelle erstellen und die Versionsnummer des Marketingprodukts für Releases nach 4.5 zurückgeben:

$Lookup = @{
    378389 = [version]'4.5'
    378675 = [version]'4.5.1'
    378758 = [version]'4.5.1'
    379893 = [version]'4.5.2'
    393295 = [version]'4.6'
    393297 = [version]'4.6'
    394254 = [version]'4.6.1'
    394271 = [version]'4.6.1'
    394802 = [version]'4.6.2'
    394806 = [version]'4.6.2'
    460798 = [version]'4.7'
    460805 = [version]'4.7'
    461308 = [version]'4.7.1'
    461310 = [version]'4.7.1'
    461808 = [version]'4.7.2'
    461814 = [version]'4.7.2'
    528040 = [version]'4.8'
    528049 = [version]'4.8'
}

# For One True framework (latest .NET 4x), change the Where-Object match 
# to PSChildName -eq "Full":
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse |
  Get-ItemProperty -name Version, Release -EA 0 |
  Where-Object { $_.PSChildName -match '^(?!S)\p{L}'} |
  Select-Object @{name = ".NET Framework"; expression = {$_.PSChildName}}, 
@{name = "Product"; expression = {$Lookup[$_.Release]}}, 
Version, Release

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.

# Get the text from github
$url = "https://raw.githubusercontent.com/dotnet/docs/master/docs/framework/migration-guide/how-to-determine-which-versions-are-installed.md"
$md = Invoke-WebRequest $url -UseBasicParsing
$OFS = "`n"
# Replace the weird text in the tables, and the padding
# Then trim the | off the front and end of lines
$map = $md -split "`n" -replace " installed [^|]+" -replace "\s+\|" -replace "\|$" |
    # Then we can build the table by looking for unique lines that start with ".NET Framework"
    Select-String "^.NET" | Select-Object -Unique |
    # And flip it so it's key = value
    # And convert ".NET FRAMEWORK 4.5.2" to  [version]4.5.2
    ForEach-Object { 
        [version]$v, [int]$k = $_ -replace "\.NET Framework " -split "\|"
        "    $k = [version]'$v'"
    }

# And output the whole script
@"
`$Lookup = @{
$map
}

# For extra effect we could get the Windows 10 OS version and build release id:
try {
    `$WinRelease, `$WinVer = Get-ItemPropertyValue "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" ReleaseId, CurrentMajorVersionNumber, CurrentMinorVersionNumber, CurrentBuildNumber, UBR
    `$WindowsVersion = "`$(`$WinVer -join '.') (`$WinRelease)"
} catch {
    `$WindowsVersion = [System.Environment]::OSVersion.Version
}

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse |
    Get-ItemProperty -name Version, Release -EA 0 |
    # For The One True framework (latest .NET 4x), change match to PSChildName -eq "Full":
    Where-Object { `$_.PSChildName -match '^(?!S)\p{L}'} |
    Select-Object @{name = ".NET Framework"; expression = {`$_.PSChildName}}, 
                @{name = "Product"; expression = {`$Lookup[`$_.Release]}}, 
                Version, Release,
    # Some OPTIONAL extra output: PSComputerName and WindowsVersion
    # The Computer name, so output from local machines will match remote machines:
    @{ name = "PSComputerName"; expression = {`$Env:Computername}},
    # The Windows Version (works on Windows 10, at least):
    @{ name = "WindowsVersion"; expression = { `$WindowsVersion }}
"@
Jaykul
quelle
Genau das suche ich auch, aber es fällt mir schwer, mich darauf einzulassen, was genau das tut. Soweit ich weiß, geht es in die NDP-Registrierung und durchsucht rekursiv jeden Ordner, der zum '^(?!S)\p{L}'regulären Ausdruck passt, und ruft die Versions- und Versionsinformationen ab. Was genau versucht dieser reguläre Ausdruck zu qualifizieren?
Johnrad
2
@ Johnrad PSChildNameist 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 beginnen S. 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 beginnt S. Ich habe keine Ahnung, warum Sie sich für Nicht-ASCII interessieren, wenn Sie Namen herausfiltern, die mit S... beginnen. Auf jeden Fall, weil Sie so verwirrend sind.
jpmc26
1
Jetzt bin ich verwirrter darüber, was zum Teufel Get-ItemProperty -name Version,Release -EA 0tut. Ich weiß, -EA 0ist das gleiche wie -ErrorAction SilentlyContinue, aber wie würde Get-ItemProperty -name Version,Releasesich 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 Name Versionoder Releaseim Schlüssel fehlt, und übergibt dann Objekte, bei denen dies erfolgreich war, an den nächsten Befehl in der Pipeline?
jpmc26
3
Das Get-ChildItem gibt ALLE Registrierungsunterschlüssel zurück (die Unterordner, wenn Sie so wollen). Get-ItemProperty gibt die Werte zurück (insbesondere "Version" und "Release"). Wir ignorieren die Fehler, da uns Ordner ohne diese Werte egal sind. Also ja, im Grunde finden wir JEDEN Unterordner und suchen dann nach Version oder Release (alle Ordner ohne einen oder beide werden ignoriert).
Jaykul
3
Genial! Ich habe die (?!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. ;)
Chiramisu
27
gci 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' |
sort pschildname -des                                  |
select -fi 1 -exp pschildname

Diese Antwort gibt nicht 4.5 zurück, wenn das installiert ist. Die Antwort unten von @Jaykul und die Verwendung von recurse tut es.

Jason Stangroome
quelle
5
gci 'HKLM: \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP' | sort pschildname -des | foreach-object {$ _. name; $ _. GetValue ("Version");}
MattUebel
Für mich ist die Antwort jetzt oben, also hier ein Link dazu :-): stackoverflow.com/a/3495491/1747983
Tilo
1
Nach der Installation von .NET 4.7.1 unter Windows 10 wird weiterhin v4.0 zurückgegeben.
Matt
24

Unterstützung für v4.8 zum Skript hinzugefügt:

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -recurse |
Get-ItemProperty -name Version,Release -EA 0 |
Where { $_.PSChildName -match '^(?![SW])\p{L}'} |
Select PSChildName, Version, Release, @{
  name="Product"
  expression={
      switch -regex ($_.Release) {
        "378389" { [Version]"4.5" }
        "378675|378758" { [Version]"4.5.1" }
        "379893" { [Version]"4.5.2" }
        "393295|393297" { [Version]"4.6" }
        "394254|394271" { [Version]"4.6.1" }
        "394802|394806" { [Version]"4.6.2" }
        "460798|460805" { [Version]"4.7" }
        "461308|461310" { [Version]"4.7.1" }
        "461808|461814" { [Version]"4.7.2" }
        "528040|528049" { [Version]"4.8" }
        {$_ -gt 528049} { [Version]"Undocumented version (> 4.8), please update script" }
      }
    }
}
AlexBar
quelle
21
[environment]::Version

Gibt Ihnen eine Instanz Versionfür die CLR, die die aktuelle Kopie von PSH verwendet (wie hier dokumentiert ).

Richard
quelle
3
Ich habe .NET 4 installiert, aber PowerShell verwendet nur die 2.0-Laufzeit. Das hilft hier also nicht wirklich.
Joey
@Johannes: Siehe Kommentar zu Ihrem Q, Sie müssen explizit angeben, was Sie wollen.
Richard
9
Für Powershell 2.0 können Sie auch $PSVersionTabledie Version der CLR ermitteln, auf der PowerShell ausgeführt wird.
Keith Hill
6
Wie wäre es mit höheren Versionen? Ich habe jetzt .NET 4.7.1 und das Skript gibt immer 4.0.30319 Rev. 42000 zurück.
Matt
@Matt müssen Sie den Nebenteil der Version übersetzen ... und beachten Sie, dass je nach den Einstellungen in der Powershell-Konfiguration möglicherweise nicht die neueste Neben- / Patch-Version verwendet wird.
Richard
13

Richtige Syntax:

[System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion()
#or
$PSVersionTable.CLRVersion

Die GetSystemVersionFunktion gibt eine Zeichenfolge wie folgt zurück:

v2.0.50727        #PowerShell v2.0 in Win 7 SP1

oder so

v4.0.30319        #PowerShell v3.0 (Windows Management Framework 3.0) in Win 7 SP1

$PSVersionTableist ein schreibgeschütztes Objekt. Die CLRVersion-Eigenschaft ist eine strukturierte Versionsnummer wie folgt:

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      30319  18444   
Desmond Lee
quelle
1
Ich habe dies auf win8 versucht, es gibt nichts zurück. Unter Windows 7 wird 2 zurückgegeben, während 4.5.1 bereits installiert ist. Ich weiß nicht, warum dies auf neuen Plattformen nicht verwendbar ist. Auf Win Sesrver 2008 funktioniert es.
Max
Die erste Option funktioniert in meiner Windows 8 64-Bit-Umgebung. Die zweite Option funktioniert, aber ich denke, sie zeigt nur die .NET-Version an, in der die aktuelle Instanz von PowerShell ausgeführt wird. Dies ist fast immer die neueste. (Bearbeiten: Vielleicht tun sie beide.)
Mumm
hier gilt das gleiche. Unter Windows 7 habe ich sowohl .net 2.0 als auch 4.0, aber der Befehl zeigt nur v2.0.50727 an. Verwenden Sie Jaykuls Ansatz.
Max
Clr-Version entspricht nicht der Framework-Version, 4+ Frameworks basieren alle auf 4 clr
janv8000
Wie wäre es mit höheren Versionen? Ich habe jetzt .NET 4.7.1 und das Skript gibt immer 4.0.30319 Rev. 42000 zurück.
Matt
11

Ich fand dies durch Tab-Vervollständigung in Powershell für Osx:

[System.Runtime.InteropServices.RuntimeInformation]::get_FrameworkDescription() .NET Core 4.6.25009.03

js2010
quelle
1
Ja, es wird .NET Framework 4.7.2558.0 zurückgegeben - aber wie kann man 4.7 von 4.7.1 unterscheiden (ich habe 4.7.1 auf meinem Windows 10-Computer).
Matt
1
[version]([Runtime.InteropServices.RuntimeInformation]::FrameworkDescription -replace '^.[^\d.]*','')
Rabash
2

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:

PS> Get-DotNetVersion -LocalHost -nosummary


ComputerName : localhost
>=4.x        : 4.5.2
v4\Client    : Installed
v4\Full      : Installed
v3.5         : Installed
v3.0         : Installed
v2.0.50727   : Installed
v1.1.4322    : Not installed (no key)
Ping         : True
Error        :

Oder so, wenn Sie es nur für ein .NET Framework testen möchten > = 4. * :

PS> (Get-DotNetVersion -LocalHost -nosummary).">=4.x"
4.5.2

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-DotnetLatestCompanyund aktualisieren Install-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):

function Get-DotNetVersionByFs {
  <#
    .SYNOPSIS
      NOT RECOMMENDED - try using instead:
        Get-DotNetVersion 
          from DotNetVersionLister module (https://github.com/EliteLoser/DotNetVersionLister), 
          but it is not usable/importable in PowerShell 2.0 
        Get-DotNetVersionByReg
          reg(istry) based: (available herin as well) but it may return some wrong version or may not work reliably for versions > 4.5 
          (works in PSv2.0)
      Get-DotNetVersionByFs (this):  
        f(ile) s(ystem) based: determines the latest installed .NET version based on $Env:windir\Microsoft.NET\Framework content
        this is unreliable, e.g. if 4.0* is already installed some 4.5 update will overwrite content there without
        renaming the folder
        (works in PSv2.0)
    .EXAMPLE
      PS> Get-DotnetVersionByFs
      4.0.30319
    .EXAMPLE
      PS> Get-DotnetVersionByFs -All
      1.0.3705
      1.1.4322
      2.0.50727
      3.0
      3.5
      4.0.30319
    .NOTES
      from https://stackoverflow.com/a/52078523/1915920
  #>
    [cmdletbinding()]
  param(
    [Switch]$All  ## do not return only latest, but all installed
  )
  $list = ls $Env:windir\Microsoft.NET\Framework |
    ?{ $_.PSIsContainer -and $_.Name -match '^v\d.[\d\.]+' } |
    %{ $_.Name.TrimStart('v') }
  if ($All) { $list } else { $list | select -last 1 }
}


function Get-DotNetVersionByReg {
  <#
    .SYNOPSIS
      NOT RECOMMENDED - try using instead:
        Get-DotNetVersion
          From DotNetVersionLister module (https://github.com/EliteLoser/DotNetVersionLister), 
          but it is not usable/importable in PowerShell 2.0. 
          Determines the latest installed .NET version based on registry infos under 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP'
    .EXAMPLE
        PS> Get-DotnetVersionByReg
        4.5.51209
    .EXAMPLE
        PS> Get-DotnetVersionByReg -AllDetailed
        PSChildName                                          Version                                             Release
        -----------                                          -------                                             -------
        v2.0.50727                                           2.0.50727.5420
        v3.0                                                 3.0.30729.5420
        Windows Communication Foundation                     3.0.4506.5420
        Windows Presentation Foundation                      3.0.6920.5011
        v3.5                                                 3.5.30729.5420
        Client                                               4.0.0.0
        Client                                               4.5.51209                                           379893
        Full                                                 4.5.51209                                           379893
    .NOTES
      from https://stackoverflow.com/a/52078523/1915920
  #>
    [cmdletbinding()]
    param(
        [Switch]$AllDetailed  ## do not return only latest, but all installed with more details
    )
    $Lookup = @{
        378389 = [version]'4.5'
        378675 = [version]'4.5.1'
        378758 = [version]'4.5.1'
        379893 = [version]'4.5.2'
        393295 = [version]'4.6'
        393297 = [version]'4.6'
        394254 = [version]'4.6.1'
        394271 = [version]'4.6.1'
        394802 = [version]'4.6.2'
        394806 = [version]'4.6.2'
        460798 = [version]'4.7'
        460805 = [version]'4.7'
        461308 = [version]'4.7.1'
        461310 = [version]'4.7.1'
        461808 = [version]'4.7.2'
        461814 = [version]'4.7.2'
    }
    $list = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse |
        Get-ItemProperty -name Version, Release -EA 0 |
        # For One True framework (latest .NET 4x), change match to PSChildName -eq "Full":
        Where-Object { $_.PSChildName -match '^(?!S)\p{L}'} |
        Select-Object `
           @{
               name = ".NET Framework" ; 
               expression = {$_.PSChildName}}, 
           @{  name = "Product" ; 
               expression = {$Lookup[$_.Release]}}, 
           Version, Release
    if ($AllDetailed) { $list | sort version } else { $list | sort version | select -last 1 | %{ $_.version } }
}

Anwendungsbeispiel:

PS> Get-DotNetVersionByFs
4.0.30319

PS> Get-DotNetVersionByFs -All
1.0.3705
1.1.4322
2.0.50727
3.0
3.5
4.0.30319

PS> Get-DotNetVersionByReg
4.5.51209

PS> Get-DotNetVersionByReg -AllDetailed

.NET Framework                   Product Version        Release
--------------                   ------- -------        -------
v2.0.50727                               2.0.50727.5420
v3.0                                     3.0.30729.5420
Windows Communication Foundation         3.0.4506.5420
Windows Presentation Foundation          3.0.6920.5011
v3.5                                     3.5.30729.5420
Client                                   4.0.0.0
Client                           4.5.2   4.5.51209      379893
Full                             4.5.2   4.5.51209      379893
Andreas Dietrich
quelle
Um die Timings nicht zu sehen, verwenden Sie(Get-DotNetVersion -LocalHost -nosummary).">=4.x"
ΩmegaMan
@ ΩmegaMan: thx - aktualisiert Ihre gute Empfehlung in Antwort oben :)
Andreas Dietrich
1

Nicht hübsch. Auf jeden Fall nicht schön:

ls $Env:windir\Microsoft.NET\Framework | ? { $_.PSIsContainer } | select -exp Name -l 1

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.

Joey
quelle
Sie müssen etwas mehr filtern. "V [.0-9] +" sollte die Übereinstimmung auf die .NET-Ordner beschränken (ich habe dort einige andere Ordner). Und dann überprüfen Sie, ob es eine echte Installation gibt ... WMI auf installierten Komponenten ist möglicherweise einfacher.
Richard
Hm, richtig ... auf diesem Computer gibt es noch ein paar andere Ordner - ich hatte nur ein paar andere Dateien auf meinem anderen Computer. Diese ganze Antwort war jedoch eher ein Fall von »Arbeiten für mich«. Ich bin sicher, dass es einen zuverlässigen und beabsichtigten Weg gibt, diese Informationen zu erhalten.
Joey
6
psake (Build Automation Tool) verfolgt einen ähnlichen Ansatz und verwendet ihn erfolgreich (oder zumindest hat ihn niemand aufgrund eines Problems geändert). Aber es ist wahr, dass sie keine vollständige Framework-Version benötigen ... Für meinen Computer kommt dies näher:ls $Env:windir\Microsoft.NET\Framework | ? { $_.PSIsContainer -and $_.Name -match '^v\d.[\d\.]+' } | % { $_.Name.TrimStart('v') }
stej
Von allen Einzeilern in den Antworten ist der von stej bereitgestellte der sauberste und funktioniert wie erwartet. Wenn es eine Antwort wäre, hätte ich dafür gestimmt.
Bratch
Leider ist es nicht zuverlässig. Ich habe jetzt .NET 4.7.1 und das Skript gibt immer v4.0.30319 zurück.
Matt
0

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.

Abdul Rauf
quelle
Dieser Befehl ruft die CLR-Version ab, nicht die .NET Framework-Version - was anders ist.
user11909
0

Hier ist meine Meinung zu dieser Frage gemäß der MSFT-Dokumentation :

$gpParams = @{
    Path        = 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full'
    ErrorAction = 'SilentlyContinue'
}
$release = Get-ItemProperty @gpParams | Select-Object -ExpandProperty Release

".NET Framework$(
    switch ($release) {
        ({ $_ -ge 528040 }) { ' 4.8'; break }
        ({ $_ -ge 461808 }) { ' 4.7.2'; break }
        ({ $_ -ge 461308 }) { ' 4.7.1'; break }
        ({ $_ -ge 460798 }) { ' 4.7'; break }
        ({ $_ -ge 394802 }) { ' 4.6.2'; break }
        ({ $_ -ge 394254 }) { ' 4.6.1'; break }
        ({ $_ -ge 393295 }) { ' 4.6'; break }
        ({ $_ -ge 379893 }) { ' 4.5.2'; break }
        ({ $_ -ge 378675 }) { ' 4.5.1'; break }
        ({ $_ -ge 378389 }) { ' 4.5'; break }
        default { ': 4.5+ not installed.' }
    }
)"

Dieses Beispiel funktioniert mit allen PowerShell-Versionen und funktioniert auf Dauer, da 4.8 die letzte .NET Framework-Version ist.

Maximilian Burszley
quelle
-1

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:

(Get-ChildItem -Path $Env:windir\Microsoft.NET\Framework | Where-Object {$_.PSIsContainer -eq $true } | Where-Object {$_.Name -match 'v\d\.\d'} | Sort-Object -Property Name -Descending | Select-Object -First 1).Name
Macher
quelle
Ich habe 4.6.1 installiert, aber Ihr Skript gibt v4.0.30319 zurück
rob
Das funktioniert auf meinem Computer nicht (ich habe 4.7.1 installiert). Es druckt v4.0.30319
Matt
-1

Ich würde dieses in PowerShell versuchen: Arbeitete für mich!

(Get-ItemProperty "HKLM: Software \ Microsoft \ NET Framework-Setup \ NDP \ v4 \ Full"). Version

GB
quelle
Das sagt dir nicht die Wahrheit. Die dortige Versionsnummer lautet beispielsweise 4.7.03056, wenn die Produktversion 4.7.2
Jaykul lautet
-2

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 wiev2.0.50727 , denke ich).

Andy
quelle
2
Für die aktuell ausgeführte Laufzeit nicht unbedingt die zuletzt installierte.
Joey
Für die Powershell lautet die korrekte Syntax : [System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion(), aber es wird nur v4.0.30319 zurückgegeben, obwohl in meinem Fall v4.6 installiert ist.
Matt
@matt 4.0.30319 ist die CLR-Version von .Net Framework 4.0 bis .Net Framework 4.7.1. Ihr v4.6-Framework verwendet also tatsächlich 4.0.30319 als CLR-Version. Beachten Sie, dass nur der Revisionsteil der Version einen Unterschied zwischen allen .NET-Frameworks darstellt. Siehe auch: .NET Framework-Versionen und Abhängigkeiten - Microsoft Docs
Walterlv
@walterlv - Danke für den Link. Ja, das ist mir bewusst. Microsoft hat dabei einen großen Fehler gemacht. Es ist nicht einfach, eine Remoteverbindung zu einem Server herzustellen und herauszufinden, welche .net-Version genau dort installiert ist. Ein weiteres großes Problem für Administratoren und Entwickler.
Matt
Dies kann auch hilfreich sein: Microsoft: So ermitteln Sie Versionen und Service Pack-Level von .NET Framework . Es zeigt auch, wie kompliziert es wurde, herauszufinden, was genau auf Ihrem Computer installiert ist ... :-(
Matt
-2

Dies ist ein Derivat des vorherigen Beitrags, aber dies bringt die neueste Version des .net Framework 4 in meinen Tests.

get-itemproperty -name version,release "hklm:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\FULL"

Damit können Sie den Befehl auf dem Remote-Computer aufrufen:

invoke-command -computername server01 -scriptblock {get-itemproperty -name version,release "hklm:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\FULL" | select pscomputername,version,release} 

Was diese Möglichkeit mit ADModule und Namenskonventionspräfix einrichtet:

get-adcomputer -Filter 'name -like "*prefix*"' | % {invoke-command -computername $_.name -scriptblock {get-itemproperty -name version,release "hklm:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\FULL" | select pscomputername,version,release} | ft
Bill Curtis
quelle