Tập lệnh PowerShell để trả về các phiên bản .NET Framework trên máy?


182

Tập lệnh PowerShell sẽ trả về các phiên bản .NET Framework trên máy nào?

Suy đoán đầu tiên của tôi là một cái gì đó liên quan đến WMI. Có điều gì tốt hơn?

Nó chỉ là một lớp lót để chỉ trả về phiên bản mới nhất cho mỗi lần cài đặt .NET [trên mỗi dòng].


7
Một máy có thể (và sẽ) có nhiều phiên bản Fx. Bạn muốn xử lý việc đó như thế nào? Và sau đó là Fx2 .. Fx3.5SP1 lộn xộn. Phiên bản nào bạn muốn nghe?
Henk Holterman

Tôi cho rằng sẽ cần phải trả lại số phiên bản đầy đủ cho mỗi lần cài đặt.
MattUebel

1
Không có cách nào để làm điều này thông qua WMI?
Đánh dấu Richman

Bạn đã hỏi PowerShell, tôi đã tạo một cái gì đó cho C # (ứng dụng bảng điều khiển). Nếu bạn quan tâm, thì đây là ...
Matt

Thật đáng kinh ngạc khi không có thứ gì như:asp.net -v
Altimus Prime

Câu trả lời:


354

Nếu bạn định sử dụng sổ đăng ký, bạn phải truy xuất lại để có phiên bản đầy đủ cho Khung 4.x. Các câu trả lời trước đó đều trả về số gốc trên hệ thống của tôi cho .NET 3.0 (trong đó số WCF và WPF, được lồng dưới 3.0, cao hơn - tôi không thể giải thích điều đó) và không trả lại bất cứ điều gì cho 4.0 .. .

EDIT: Đối với .Net 4.5 trở lên, điều này đã thay đổi một lần nữa, vì vậy giờ đây có một bài viết MSDN hay ở đây giải thích cách chuyển đổi giá trị Phát hành thành số phiên bản .Net, đó là một sự cố tàu hỏa :-(

Điều này có vẻ đúng với tôi (lưu ý rằng nó xuất ra số phiên bản riêng cho WCF & WPF trên 3.0. Tôi không biết đó là gì). Nó cũng xuất ra cả ClientFull trên 4.0 (nếu bạn đã cài đặt cả hai):

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

Dựa trên bài viết MSDN, bạn có thể xây dựng bảng tra cứu và trả về số phiên bản sản phẩm tiếp thị cho các bản phát hành sau 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

Trên thực tế, vì tôi liên tục phải cập nhật câu trả lời này, đây là tập lệnh để tạo tập lệnh ở trên (có thêm một chút) từ nguồn đánh dấu cho trang web đó. Điều này có thể sẽ phá vỡ tại một số điểm, vì vậy tôi đang giữ bản sao hiện tại ở trên.

# 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 }}
"@

Đây chính xác là những gì tôi đang tìm kiếm, nhưng tôi đang có một thời gian khó khăn trong tâm trí của tôi xung quanh những gì chính xác điều này đang làm. Theo những gì tôi hiểu, nó sẽ đi ra đăng ký NDP và tìm kiếm đệ quy qua từng thư mục phù hợp với biểu thức chính quy '^(?!S)\p{L}'và nhận thông tin Phiên bản và Phát hành. Chính xác thì biểu hiện thường xuyên đó đang cố gắng để đủ điều kiện là gì?
Johnrad

2
@Johnrad PSChildNamelà tên lá của khóa đăng ký. \p{L}là bất kỳ ký tự nào trong danh mục "chữ cái" Unicode. (?!S)là một cái nhìn tiêu cực xung quanh, và ^là khởi đầu của chuỗi. Vì vậy, nó phải bắt đầu bằng một lá thư khác S. Vì vậy, nếu bạn chỉ xem xét ASCII, nó giống như $_.PSChildName -cmatch '^[A-RT-Za-z]'(lưu ý -cmatch). Vì vậy, nó tìm thấy các khóa trong đó tên bắt đầu bằng một chữ cái khác S. Tôi không biết tại sao bạn lại quan tâm đến phi ASCII nếu bạn lọc ra những cái tên bắt đầu bằng S... Chắc chắn với bạn là nó rất khó hiểu.
jpmc26

1
Bây giờ tôi bối rối hơn về những gì quái Get-ItemProperty -name Version,Release -EA 0đang làm. Tôi biết -EA 0là giống như -ErrorAction SilentlyContinue, nhưng sẽ Get-ItemProperty -name Version,Releasecó ảnh hưởng gì khi dẫn tất cả các kết quả đến nó? Nó dường như không loại bỏ bất kỳ biến nào khỏi đối tượng, vì các biến khác được sử dụng trong các lệnh sau này trong đường ống. Liệu nó có chạy, lỗi khi thiếu Versionhoặc Releasetên từ khóa, và sau đó chuyển các đối tượng nơi nó đã thành công vào lệnh tiếp theo trong đường ống?
jpmc26

3
Get-ChildItem trả về TẤT CẢ các khoá con đăng ký (các thư mục con, nếu bạn muốn). Get-ItemProperty trả về các giá trị (cụ thể: "Phiên bản" và "Phát hành") - chúng tôi bỏ qua các lỗi vì chúng tôi không quan tâm đến các thư mục không có các giá trị đó. Vì vậy, về cơ bản, chúng tôi tìm thấy MỌI thư mục con, sau đó tìm Phiên bản hoặc Bản phát hành (bất kỳ thư mục nào không có một hoặc cả hai thư mục này đều bị bỏ qua).
Jaykul

3
Tuyệt vời! Tôi chỉ sửa đổi (?!S)mệnh đề để (?![SW])loại trừ thêm các mục "Windows *". Điều này cũng có thể được thực hiện (?=[vCF])vì các khóa duy nhất chúng tôi thực sự quan tâm là các gốc Phiên bản và các khóa "Đầy đủ" và "Máy khách" cho .NET 4.0+. ;)
Chiramisu

27
gci 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' |
sort pschildname -des                                  |
select -fi 1 -exp pschildname

Câu trả lời này không trả về 4.5 nếu được cài đặt. Câu trả lời dưới đây từ @Jaykul và sử dụng recurse nào.


5
gci 'HKLM: \ PHẦN MỀM \ Microsoft \ NET Framework Thiết lập \ NDP' | sắp xếp pschildname -des | đối tượng foreach {$ _. name; $ _. GetValue ("Phiên bản");}
MattUebel

Đối với tôi, câu trả lời hiện đang ở trên đầu vì vậy đây là một liên kết đến nó :-): stackoverflow.com/a/3495491/1747983
Tilo

1
Đã cài đặt .NET 4.7.1 trên Windows 10, điều này vẫn trả về v4.0.
Matt

24

Đã thêm hỗ trợ v4.8 vào tập lệnh:

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

21
[environment]::Version

Cung cấp cho bạn một ví dụ về VersionCLR, bản sao hiện tại của PSH đang sử dụng (như được ghi lại ở đây ).


3
Tôi đã cài đặt .NET 4 nhưng PowerShell sẽ chỉ sử dụng thời gian chạy 2.0. Vì vậy, đó không thực sự là giúp đỡ ở đây.
Joey

@Johannes: Xem bình luận về Q của bạn, bạn cần phải rõ ràng về những gì bạn muốn.
Richard

9
Đối với Powershell 2.0, bạn cũng có thể sử dụng $PSVersionTableđể tìm phiên bản CLR PowerShell đang chạy.
Keith Hill

6
Làm thế nào về các phiên bản cao hơn? Bây giờ tôi có .NET 4.7.1 và tập lệnh luôn trả về 4.0.30319 Rev. 42000.
Matt

@Matt bạn sẽ cần dịch phần phụ của phiên bản ... và lưu ý tùy thuộc vào nội dung được đặt trong cấu hình của Powershell, có thể không sử dụng phiên bản nhỏ / bản vá mới nhất.
Richard

13

Cú pháp đúng:

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

Các GetSystemVersionhàm trả về một chuỗi như thế này:

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

hoặc như thế này

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

$PSVersionTablelà một đối tượng chỉ đọc. Thuộc tính CLRVersion là số phiên bản có cấu trúc như thế này:

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      30319  18444   

1
Tôi đã thử điều này trên win8, nó không trả về gì cả. Trên windows 7, nó trả về 2 trong khi 4.5.1 đã được cài đặt. Tôi không biết tại sao điều này không thể sử dụng được trên các nền tảng mới. Trên win Sesrver 2008, nó hoạt động.
tối đa

Tùy chọn đầu tiên hoạt động trên môi trường Windows 8, 64 bit của tôi. Tùy chọn thứ hai hoạt động, nhưng tôi nghĩ rằng chỉ hiển thị phiên bản .NET mà phiên bản hiện tại của PowerShell đang chạy, gần như luôn luôn là phiên bản mới nhất. (Chỉnh sửa: Có thể cả hai đều làm.)
Vimes

tương tự ở đây trên windows 7, tôi có cả .net 2.0 và 4.0 nhưng lệnh chỉ hiển thị v2.0.50727. Sử dụng phương pháp của Jaykul.
tối đa

Phiên bản Clr không bằng phiên bản khung, 4+ khung đều dựa trên 4 clr
janv8000

Làm thế nào về các phiên bản cao hơn? Bây giờ tôi có .NET 4.7.1 và tập lệnh luôn trả về 4.0.30319 Rev. 42000.
Matt

11

Tôi đã tìm thấy điều này thông qua việc hoàn thành tab trong powershell cho osx:

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


1
Có, nó trả về .NET Framework 4.7.2558.0 - nhưng làm cách nào để phân biệt 4.7 với 4.7.1 (Tôi có 4.7.1 trên máy Windows 10 của mình).
Matt

1
[version]([Runtime.InteropServices.RuntimeInformation]::FrameworkDescription -replace '^.[^\d.]*','')
Rabash 16/03/19



2

Giải pháp tốt

Hãy thử sử dụng mô-đun DotNetVersionLister có thể tải xuống (dựa trên thông tin đăng ký và một số bảng tra cứu phiên bản tiếp thị phiên bản).

Mà sẽ được sử dụng như thế này:

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        :

Hoặc như thế này nếu bạn chỉ muốn kiểm tra nó cho một số .NET framework> = 4. * :

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

Nhưng nó sẽ không hoạt động (cài đặt / nhập), ví dụ như với PS v2.0 ( tiêu chuẩn Win 7 , Win Server 2010 ) do không tương thích ...

Động lực cho các chức năng "di sản" dưới đây

(Bạn có thể bỏ qua việc đọc này và sử dụng mã bên dưới)

Chúng tôi đã phải làm việc với PS 2.0 trên một số máy và không thể cài đặt / nhập DotNetVersionLister ở trên .
Trên các máy khác, chúng tôi muốn cập nhật (từ PS 2.0 ) lên PS 5.1 (do đó cần .NET Framework> = 4.5 ) với sự trợ giúp của hai công ty tùy chỉnh Install-DotnetLatestCompanyInstall-PSLatestCompany.
Để hướng dẫn quản trị viên độc đáo thông qua quá trình cài đặt / cập nhật, chúng tôi sẽ phải xác định phiên bản .NET trong các chức năng này trên tất cả các máy và phiên bản PS hiện có.
Do đó, chúng tôi cũng sử dụng các chức năng dưới đây để xác định chúng an toàn hơn trong mọi môi trường ...

Các chức năng cho môi trường PS kế thừa (ví dụ: PS v2.0 )

Vì vậy, các mã sau đây và các ví dụ sử dụng (trích xuất) dưới đây rất hữu ích ở đây (dựa trên các câu trả lời khác ở đây):

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

Ví dụ sử dụng:

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

Để không xem thời gian sử dụng(Get-DotNetVersion -LocalHost -nosummary).">=4.x"
ΩmegaMan

@ MegaMan: thx - đã cập nhật đề xuất tốt của bạn trong câu trả lời ở trên :)
Andreas Dietrich

1

Không đẹp. Chắc chắn là không đẹp:

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

Điều này có thể hoặc không thể làm việc. Nhưng đối với phiên bản mới nhất thì điều này khá đáng tin cậy, vì về cơ bản có các thư mục trống cho các phiên bản cũ (1.0, 1.1) nhưng không phải là các thư mục mới hơn - chúng chỉ xuất hiện khi cài đặt khung thích hợp.

Tuy nhiên, tôi nghi ngờ phải có một cách tốt hơn.


Bạn cần lọc thêm một chút, "V [.0-9] +" sẽ giới hạn đối sánh với các thư mục .NET (Tôi có một số thư mục khác ở đó). Và sau đó kiểm tra xem có cài đặt thực không ... WMI trên các thành phần được cài đặt có thể dễ dàng hơn.
Richard

Hừm, đúng rồi ... trên máy này cũng có một vài thư mục khác - tôi chỉ có một loạt các tệp khác trên máy khác. Toàn bộ câu trả lời này là nhiều hơn một trường hợp »làm việc cho tôi«, mặc dù. Tôi chắc chắn có một cách đáng tin cậy và dự định để có được thông tin đó.
Joey

6
psake (công cụ tự động hóa xây dựng) có một cách tiếp cận tương tự và sử dụng nó thành công (hoặc ít nhất không ai thay đổi nó vì một vấn đề). Nhưng sự thật là họ không cần phiên bản khung đầy đủ ... Đối với máy tính của tôi, điều này trở nên gần gũi hơn:ls $Env:windir\Microsoft.NET\Framework | ? { $_.PSIsContainer -and $_.Name -match '^v\d.[\d\.]+' } | % { $_.Name.TrimStart('v') }
stej

Trong tất cả các câu trả lời trong câu trả lời, câu trả lời do stej cung cấp là sạch nhất và hoạt động như mong đợi. Nếu đó là câu trả lời tôi đã bỏ phiếu cho nó.
Bratch

Thật không may, nó không đáng tin cậy. Tôi có .NET 4.7.1 bây giờ và tập lệnh luôn trả về v4.0.30319.
Matt

0

Nếu bạn đã cài đặt Visual Studio trên máy của mình thì hãy mở Dấu nhắc lệnh dành cho nhà phát triển Visual Studio và gõ lệnh sau: clrver

Nó sẽ liệt kê tất cả các phiên bản đã cài đặt của .NET Framework trên máy đó.


Lệnh này nhận phiên bản CLR, không phải phiên bản .NET Framework - khác với.
dùng11909

0

Đây là câu hỏi của tôi về câu hỏi này theo tài liệu 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.' }
    }
)"

Ví dụ này hoạt động với tất cả các phiên bản PowerShell và sẽ hoạt động vĩnh viễn vì 4.8 là phiên bản .NET Framework cuối cùng.


-1

Đây là ý tưởng chung:

Nhận các mục con trong thư mục .NET Framework là các thùng chứa có tên khớp với số chấm v mẫu số . Sắp xếp chúng theo tên giảm dần, lấy đối tượng đầu tiên và trả về thuộc tính tên của nó.

Đây là kịch bản:

(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

Tôi đã cài đặt 4.6.1 nhưng tập lệnh của bạn trả về v4.0.30319
cướp

Điều đó không hoạt động trên máy của tôi (tôi đã cài đặt 4.7.1). Nó in v4.0.30319
Matt

-1

Tôi sẽ thử cái này trong PowerShell: Làm việc cho tôi!

(Get-ItemProperty "HKLM: Phần mềm \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full"). Phiên bản


Điều đó không nói cho bạn sự thật. Số phiên bản ở đó sẽ cho biết, ví dụ 4.7.03056 khi phiên bản sản phẩm là 4.7.2
Jaykul

-2

Tôi không theo cú pháp PowerShell của mình, nhưng tôi nghĩ rằng bạn chỉ có thể gọi System.R nb.InteropService.R nbEn Môi.GetSystemVersion () . Điều này sẽ trả về phiên bản dưới dạng một chuỗi ( v2.0.50727tôi nghĩ như thế ).


2
Đối với thời gian chạy hiện đang thực thi, không nhất thiết phải là cài đặt mới nhất.
Joey

Đối với powershell, cú pháp đúng là : [System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion(), nhưng nó chỉ trả về v4.0.30319, mặc dù v4.6 được cài đặt trong trường hợp của tôi.
Matt

@matt 4.0.30319 là phiên bản CLR từ .Net Framework 4.0 đến .Net Framework 4.7.1. Vì vậy, khung v4.6 của bạn thực sự sử dụng 4.0.30319 làm phiên bản CLR của nó. Lưu ý rằng chỉ có phần Sửa đổi của Phiên bản là khác biệt giữa tất cả các Khung .Net. Xem thêm: Các phiên bản và phụ thuộc của .NET Framework - Microsoft Docs
walterlv

@walterlv - Cảm ơn bạn đã liên kết. Vâng, tôi nhận thức được điều đó. Microsoft đã phạm một sai lầm lớn để làm điều đó, không dễ để kết nối từ xa với máy chủ và tìm ra phiên bản .net nào chính xác được cài đặt ở đó. Một vấn đề đau đầu khác cho các quản trị viên và nhà phát triển.
Matt

Và điều này cũng có thể hữu ích: Microsoft: Cách xác định phiên bản và cấp độ gói dịch vụ của .NET Framework . Nó cũng cho thấy mức độ phức tạp của nó khi tìm hiểu chính xác những gì được cài đặt trên máy của bạn ... :-(
Matt

-2

Đây là một dẫn xuất của bài viết trước, nhưng đây là phiên bản mới nhất của .net framework 4 trong các thử nghiệm của tôi.

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

Điều này sẽ cho phép bạn gọi lệnh đến máy từ xa:

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

Mà thiết lập khả năng này với ADModule và tiền tố quy ước đặt tên:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.