Skrip PowerShell untuk mengembalikan versi .NET Framework pada mesin?

182

Apa yang akan menjadi skrip PowerShell untuk mengembalikan versi .NET Framework pada mesin?

Tebakan pertama saya adalah sesuatu yang melibatkan WMI. Apakah ada sesuatu yang lebih baik?

Seharusnya hanya satu baris untuk mengembalikan hanya versi terbaru untuk setiap instalasi .NET [pada setiap baris].

MattUebel
sumber
7
Mesin dapat (dan akan) memiliki beberapa versi Fx. Bagaimana Anda ingin mengatasinya? Dan kemudian ada kekacauan Fx2 .. Fx3.5SP1. Versi apa yang ingin Anda dengar?
Henk Holterman
Saya kira akan perlu untuk mengembalikan nomor versi lengkap untuk setiap pemasangan.
MattUebel
1
Apakah tidak ada cara untuk melakukan ini melalui WMI?
Mark Richman
Anda meminta PowerShell, saya membuat sesuatu untuk C # (aplikasi konsol). Jika Anda tertarik, di sini adalah ...
Matt
Sungguh luar biasa bahwa tidak ada sesuatu seperti:asp.net -v
Altimus Prime

Jawaban:

354

Jika Anda akan menggunakan registri Anda harus berulang untuk mendapatkan versi lengkap untuk 4.x Framework. Jawaban sebelumnya keduanya mengembalikan nomor root pada sistem saya untuk .NET 3.0 (di mana nomor WCF dan WPF, yang bersarang di bawah 3.0, lebih tinggi - saya tidak bisa menjelaskannya), dan gagal mengembalikan apa pun untuk 4.0 .. .

EDIT: Untuk .Net 4.5 ke atas, ini berubah sedikit lagi, jadi sekarang ada artikel MSDN yang bagus di sini yang menjelaskan cara mengonversi nilai Rilis ke nomor versi .Net, ini kecelakaan total kereta :-(

Ini terlihat benar bagi saya (perhatikan bahwa ini mengeluarkan nomor versi terpisah untuk WCF & WPF pada 3.0. Saya tidak tahu tentang apa itu). Ini juga menampilkan Klien dan Penuh pada 4.0 (jika Anda memiliki keduanya diinstal):

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

Berdasarkan artikel MSDN, Anda bisa membuat tabel pencarian dan mengembalikan nomor versi produk pemasaran untuk rilis setelah 4.5:

$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

Bahkan, karena saya terus memperbarui jawaban ini, inilah skrip untuk menghasilkan skrip di atas (dengan sedikit tambahan) dari sumber penurunan harga untuk halaman web itu. Ini mungkin akan rusak di beberapa titik, jadi saya menyimpan salinan saat ini di atas.

# 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
sumber
Ini persis apa yang saya cari juga, tetapi saya mengalami kesulitan membungkus pikiran saya di sekitar apa yang sebenarnya sedang dilakukan. Dari apa yang saya pahami, akan keluar ke registri NDP dan secara rekursif mencari melalui setiap folder yang sesuai dengan '^(?!S)\p{L}'regex dan mendapatkan informasi Versi dan Rilis. Apa tepatnya ekspresi reguler yang berusaha memenuhi syarat?
Johnrad
2
@ Johnrad PSChildNameadalah nama daun dari kunci registri. \p{L}adalah karakter apa pun dalam "huruf" kategori Unicode. (?!S)adalah pandangan negatif di sekitar, dan ^merupakan awal dari string. Jadi harus dimulai dengan surat selain S. Jadi, jika Anda hanya mempertimbangkan ASCII, itu sama dengan $_.PSChildName -cmatch '^[A-RT-Za-z]'(perhatikan -cmatch). Jadi ia menemukan kunci di mana nama dimulai dengan huruf selain S. Saya tidak tahu mengapa Anda akan peduli dengan non-ASCII jika Anda memfilter nama yang dimulai dengan S... Pasti Anda terlalu bingung.
jpmc26
1
Sekarang saya lebih bingung tentang apa yang Get-ItemProperty -name Version,Release -EA 0sedang dilakukan. Saya tahu -EA 0ini sama dengan -ErrorAction SilentlyContinue, tetapi apa efek yang akan Get-ItemProperty -name Version,Releaseterjadi ketika mengirim semua hasil ke sana? Tampaknya tidak menghapus variabel apa pun dari objek, karena yang lain digunakan dalam perintah kemudian dalam pipa. Apakah itu berjalan, kesalahan ketika nama Versionatau Releasehilang dari kunci, dan kemudian melewati objek di mana ia berhasil masuk ke perintah berikutnya di dalam pipa?
jpmc26
3
Get-ChildItem mengembalikan SEMUA subkunci registri (subfolder, jika Anda mau). Get-ItemProperty mengembalikan nilai (khususnya: "Versi" dan "Rilis") - kami mengabaikan kesalahan karena kami tidak peduli dengan folder yang tidak memiliki nilai-nilai itu. Jadi ya, pada dasarnya kami menemukan SETIAP subfolder, dan kemudian mencari Versi atau Rilis (folder apa pun tanpa satu atau keduanya diabaikan).
Jaykul
3
Luar biasa! Saya hanya mengubah (?!S)klausa untuk lebih (?![SW])lanjut mengecualikan entri "Windows *". Ini juga dapat dilakukan dengan (?=[vCF])karena satu-satunya kunci yang benar-benar kita pedulikan adalah akar Versi dan kunci "Penuh" dan "Klien" untuk .NET 4.0+. ;)
Chiramisu
27
gci 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' |
sort pschildname -des                                  |
select -fi 1 -exp pschildname

Jawaban ini tidak mengembalikan 4,5 jika itu diinstal. Jawaban di bawah ini dari @Jaykul dan menggunakan recurse tidak.

Jason Stangroome
sumber
5
gci 'HKLM: \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP' | semacam pschildname -des | foreach-object {$ _. name; $ _. GetValue ("Version");}
MattUebel
bagi saya jawabannya sekarang di atas jadi di sini tautannya :-): stackoverflow.com/a/3495491/1747983
Tilo
1
Setelah menginstal .NET 4.7.1 pada Windows 10, ini masih mengembalikan v4.0.
Mat
24

Menambahkan dukungan v4.8 ke skrip:

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
sumber
21
[environment]::Version

Memberi Anda sebuah contoh Versionuntuk CLR salinan PSH saat ini menggunakan (seperti yang didokumentasikan di sini ).

Richard
sumber
3
Saya telah menginstal .NET 4 tetapi PowerShell hanya akan menggunakan runtime 2.0. Jadi itu tidak benar-benar membantu di sini.
Joey
@Johannes: Lihat komentar pada Q Anda, Anda harus eksplisit tentang apa yang Anda inginkan.
Richard
9
Untuk Powershell 2.0, Anda juga dapat menggunakan $PSVersionTableuntuk menemukan versi CLR PowerShell sedang berjalan.
Keith Hill
6
Bagaimana dengan versi yang lebih tinggi? Saya memiliki .NET 4.7.1 sekarang, dan skrip selalu mengembalikan 4.0.30319 Rev. 42000.
Matt
@Matt Anda harus menerjemahkan bagian minor dari versi ... dan perhatikan tergantung pada apa yang diatur dalam konfigurasi Powershell mungkin tidak menggunakan versi minor / patch terbaru.
Richard
13

Sintaks yang benar:

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

The GetSystemVersionmengembalikan fungsi string seperti ini:

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

atau seperti ini

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

$PSVersionTableadalah objek hanya baca. Properti CLRVersion adalah nomor versi terstruktur seperti ini:

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      30319  18444   
Desmond Lee
sumber
1
Saya mencoba ini pada win8, tidak mengembalikan apa pun. Pada windows 7, ia mengembalikan 2 sementara 4.5.1 sudah diinstal. Saya tidak tahu mengapa ini tidak dapat digunakan pada platform baru. Pada win sesrver 2008, berhasil.
maks
Opsi pertama berfungsi pada lingkungan Windows 8, 64-bit saya. Opsi kedua berfungsi, tapi saya pikir itu hanya menunjukkan versi .NET bahwa instance PowerShell saat ini berjalan, yang hampir selalu merupakan yang terbaru. (Sunting: Mungkin mereka berdua melakukannya.)
Vimes
sama disini. pada windows 7, saya memiliki keduanya .net 2.0 dan 4.0 tetapi perintah hanya menunjukkan v2.0.50727. Gunakan pendekatan Jaykul.
maks
Versi CLR tidak sama dengan versi framework, 4+ frameworks semua berdasarkan pada 4
clr
Bagaimana dengan versi yang lebih tinggi? Saya memiliki .NET 4.7.1 sekarang, dan skrip selalu mengembalikan 4.0.30319 Rev. 42000.
Matt
11

Saya menemukan ini melalui penyelesaian tab di PowerShell untuk OSX:

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

js2010
sumber
1
Ya, ia mengembalikan .NET Framework 4.7.2558.0 - tetapi bagaimana seseorang dapat membedakan 4.7 dari 4.7.1 (Saya memiliki 4.7.1 di mesin Windows 10 saya).
Mat
1
[version]([Runtime.InteropServices.RuntimeInformation]::FrameworkDescription -replace '^.[^\d.]*','')
Rabash
2

Solusi bagus

Coba gunakan modul DotNetVersionLister yang dapat diunduh (berdasarkan info registri dan beberapa tabel pencarian versi ke pemasaran).

Yang akan digunakan seperti ini:

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        :

Atau seperti ini jika Anda hanya ingin mengujinya untuk beberapa kerangka .NET> = 4. * :

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

Tapi itu tidak akan berfungsi (instal / impor) misalnya dengan PS v2.0 ( Win 7 , Win Server 2010 standar) karena ketidakcocokan ...

Motivasi untuk fungsi "warisan" di bawah

(Anda dapat melewati membaca ini dan menggunakan kode di bawah ini)

Kami harus bekerja dengan PS 2.0 pada beberapa mesin dan tidak dapat menginstal / mengimpor DotNetVersionLister di atas .
Pada mesin lain kami ingin memperbarui (dari PS 2.0 ) ke PS 5.1 (yang pada gilirannya membutuhkan .NET Framework> = 4.5 ) dengan bantuan dua custom-company Install-DotnetLatestCompanydan Install-PSLatestCompany.
Untuk memandu admin dengan baik melalui proses instalasi / pembaruan, kami harus menentukan versi .NET di fungsi-fungsi ini pada semua mesin dan versi PS yang ada.
Jadi kami juga menggunakan fungsi di bawah ini untuk menentukan mereka lebih aman di semua lingkungan ...

Fungsi untuk lingkungan PS lawas (mis. PS v2.0 )

Jadi kode berikut dan di bawah ini (diekstraksi) contoh penggunaan berguna di sini (berdasarkan jawaban lain di sini):

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 } }
}

Contoh penggunaan:

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
sumber
Untuk tidak melihat timing, gunakan(Get-DotNetVersion -LocalHost -nosummary).">=4.x"
ΩmegaMan
@ ΩmegaMan: thx - memperbarui rekomendasi bagus Anda dalam jawaban di atas :)
Andreas Dietrich
1

Tidak cantik. Jelas tidak cantik:

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

Ini mungkin atau mungkin tidak berhasil. Tetapi sejauh menyangkut versi terbaru, ini seharusnya cukup andal, karena pada dasarnya ada folder kosong untuk versi lama (1.0, 1.1) tetapi tidak yang lebih baru - yang hanya muncul setelah kerangka kerja yang sesuai diinstal.

Meski begitu, saya curiga pasti ada cara yang lebih baik.

Joey
sumber
Anda perlu memfilter lebih banyak lagi, "V [.0-9] +" harus membatasi kecocokan ke folder .NET (saya punya beberapa folder lain di sana). Dan kemudian periksa apakah ada instalasi nyata ... WMI pada komponen yang diinstal mungkin lebih mudah.
Richard
Hm, benar ... pada mesin ini ada beberapa folder lain juga - Saya hanya punya banyak file lain di komputer saya yang lain. Namun, seluruh jawaban ini lebih merupakan kasus "bekerja untuk saya". Saya yakin ada cara yang dapat diandalkan dan dimaksudkan untuk mendapatkan informasi itu.
Joey
6
psake (build automation tool) menggunakan pendekatan yang sama dan menggunakannya dengan sukses (atau setidaknya tidak ada yang mengubahnya karena masalah). Tetapi memang benar bahwa mereka tidak memerlukan versi kerangka penuh ... Untuk komputer saya ini semakin dekat:ls $Env:windir\Microsoft.NET\Framework | ? { $_.PSIsContainer -and $_.Name -match '^v\d.[\d\.]+' } | % { $_.Name.TrimStart('v') }
stej
Dari semua jawaban dalam satu baris, jawaban yang disediakan oleh stej adalah yang terbersih dan berfungsi seperti yang diharapkan. Jika itu adalah jawaban saya akan memilihnya.
Bratch
Sayangnya, itu tidak dapat diandalkan. Saya memiliki .NET 4.7.1 sekarang, dan skrip selalu mengembalikan v4.0.30319.
Mat
0

Jika Anda telah menginstal Visual Studio pada mesin Anda kemudian buka Prompt Perintah Pengembang Visual Studio dan ketik perintah berikut: clrver

Ini akan mencantumkan semua versi .NET Framework yang diinstal pada mesin itu.

Abdul Rauf
sumber
Perintah ini mendapatkan versi CLR, bukan versi .NET Framework - yang berbeda.
user11909
0

Inilah pendapat saya tentang pertanyaan ini setelah dokumentasi msft :

$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.' }
    }
)"

Contoh ini berfungsi dengan semua versi PowerShell dan akan bekerja selamanya karena 4.8 adalah versi .NET Framework terakhir.

Maximilian Burszley
sumber
-1

Inilah gagasan umum:

Dapatkan item turunan dalam direktori .NET Framework yang merupakan wadah yang namanya cocok dengan pola nomor dot nomor v . Urutkan berdasarkan nama menurun, ambil objek pertama, dan kembalikan properti namanya.

Ini skripnya:

(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
pelaku
sumber
Saya telah 4.6.1 diinstal tetapi skrip Anda mengembalikan v4.0.30319
rob
Itu tidak berfungsi pada mesin saya (saya sudah menginstal 4.7.1). Mencetak v4.0.30319
Matt
-1

Saya akan mencoba yang ini di PowerShell: Bekerja untuk saya!

(Get-ItemProperty "HKLM: Perangkat Lunak \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full"). Versi

GB
sumber
Itu tidak mengatakan yang sebenarnya. Nomor versi di sana akan mengatakan, misalnya 4.7.03056 ketika versi produk 4.7.2
Jaykul
-2

Saya tidak mengerti sintaks PowerShell saya, tapi saya pikir Anda bisa memanggil System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion () . Ini akan mengembalikan versi sebagai string (sesuatu seperti v2.0.50727, saya pikir).

Andy
sumber
2
Untuk runtime yang sedang dieksekusi, belum tentu yang diinstal terbaru.
Joey
Untuk PowerShell, sintaks yang benar adalah [System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion():, tetapi hanya mengembalikan v4.0.30319, meskipun v4.6 diinstal dalam kasus saya.
Matt
@matt 4.0.30319 adalah versi CLR dari .Net Framework 4.0 hingga .Net Framework 4.7.1. Jadi kerangka kerja v4.6 Anda sebenarnya menggunakan 4.0.30319 sebagai versi CLR-nya. Perhatikan bahwa hanya bagian Revisi dari Versi yang berbeda antara semua .Net Frameworks. Lihat Juga: Versi dan Ketergantungan NET Framework. - Microsoft Docs
walterlv
@walterlv - Terima kasih atas tautannya. Ya, saya tahu itu. Microsoft membuat kesalahan besar untuk melakukan itu, tidak mudah untuk melakukan koneksi jauh ke server dan mencari tahu. Net versi mana yang sebenarnya diinstal di sana. Sakit kepala besar lainnya untuk admin dan pengembang.
Matt
Dan ini mungkin membantu juga: Microsoft: Cara menentukan tingkat versi dan paket layanan .NET Framework . Ini juga menunjukkan betapa rumitnya untuk mengetahui apa sebenarnya yang diinstal pada mesin Anda ... :-(
Matt
-2

Ini adalah turunan dari posting sebelumnya, tetapi ini mendapatkan versi terbaru dari .net framework 4 dalam pengujian saya.

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

Yang akan memungkinkan Anda untuk memanggil-perintah ke mesin jarak jauh:

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

Yang mengatur kemungkinan ini dengan ADModule dan awalan konvensi penamaan:

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
sumber