컴퓨터에서 .NET Framework 버전을 반환하는 PowerShell 스크립트?


182

컴퓨터에서 .NET Framework 버전을 반환하는 PowerShell 스크립트는 무엇입니까?

내 첫 번째 추측은 WMI와 관련된 것입니다. 더 좋은 것이 있습니까?

.NET을 설치할 때마다 최신 버전 만 반환합니다 (각 라인마다).


7
기계는 여러 버전의 Fx를 가질 있습니다. 어떻게 처리하고 싶습니까? 그리고 Fx2 .. Fx3.5SP1 혼란이 있습니다. 어떤 버전을 듣고 싶습니까?
Henk Holterman

각 설치마다 전체 버전 번호를 반환해야한다고 가정합니다.
MattUebel

1
WMI를 통해이를 수행 할 수있는 방법이 없습니까?
Mark Richman

PowerShell을 요청했는데 C # (콘솔 응용 프로그램)을 위해 무언가를 만들었습니다. 관심이 있으시다면 여기 있습니다.
Matt

다음과 같은 것이 없다는 것이 정말 놀랍습니다.asp.net -v
Altimus Prime

답변:


354

레지스트리를 사용하려면 4.x Framework의 정식 버전을 얻으려면 재귀를 사용해야합니다. 이전 답변은 내 시스템에서 .NET 3.0 (3.0 아래에 중첩 된 WCF 및 WPF 번호가 더 높음-설명 할 수 없음)의 루트 번호를 반환하고 4.0에 대해서는 아무것도 반환하지 않습니다. .

편집 : .Net 4.5 이상에서는 약간 다시 변경되었으므로 이제 릴리스 값을 .Net 버전 번호 로 변환하는 방법을 설명하는 멋진 MSDN 기사가 있습니다.

이것은 나에게 잘 보입니다 (3.0에서 WCF & WPF에 대한 별도의 버전 번호를 출력합니다. 그게 뭔지 모르겠습니다). 또한 4.0에서 ClientFull 을 모두 출력합니다 (모두 설치되어있는 경우).

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

MSDN 기사를 기반으로 조회 테이블을 작성하고 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

사실,이 답변을 계속 업데이트해야하므로 해당 웹 페이지의 마크 다운 소스에서 위의 스크립트를 약간 추가하여 생성하는 스크립트가 있습니다. 이것은 아마도 어느 시점에서 깨질 것이므로 현재 사본을 위에 보관하고 있습니다.

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

이것은 내가 찾는 것이기도하지만 정확히 이것이하는 일에 대해 내 마음을 감싸는 데 어려움을 겪고 있습니다. 내가 이해 한 바에 따르면 NDP 레지스트리로 이동하여 '^(?!S)\p{L}'정규식에 맞는 각 폴더를 반복적으로 검색 하고 버전 및 릴리스 정보를 얻습니다. 정규 표현식이 정확히 어떤 자격을 갖추려고합니까?
Johnrad

2
@Johnrad PSChildName는 레지스트리 키의 리프 이름입니다. \p{L}유니 코드 범주 "letter"의 모든 문자입니다. (?!S)주변의 부정적인 모습 ^이며 문자열의 시작입니다. 따라서 다른 문자로 시작해야합니다 S. 따라서 ASCII 만 고려하면 (와 동일)와 동일 $_.PSChildName -cmatch '^[A-RT-Za-z]'합니다 -cmatch. 이름이 이외의 문자로 시작하는 키를 찾습니다 S. 나는 당신이 S...로 시작하는 이름을 걸러 낼 때 왜 비 ASCII에 관심을 가질 지 모르겠다 .
jpmc26

1
이제 도대체 무슨 일이 더 혼란스러워 해요 Get-ItemProperty -name Version,Release -EA 0. 나는 -EA 0과 동일 하다는 것을 알고 -ErrorAction SilentlyContinue있지만 Get-ItemProperty -name Version,Release모든 결과를 파이핑 할 때 어떤 영향을 미칩니 까? 파이프 라인의 이후 명령에서 다른 변수가 사용되므로 객체에서 변수를 제거하지 않는 것 같습니다. 키에서 Version또는 Release이름이 누락 되면 실행되고 오류가 발생한 후 성공한 개체를 파이프 라인의 다음 명령으로 전달합니까?
jpmc26

3
Get-ChildItem은 모든 레지스트리 하위 키 (필요한 경우 하위 폴더)를 반환합니다. Get-ItemProperty는 값 (특히 "Version"및 "Release")을 반환합니다. 이러한 값이없는 폴더는 신경 쓰지 않으므로 오류를 무시합니다. 예, 기본적으로 모든 하위 폴더를 찾은 다음 버전 또는 릴리스를 찾습니다 (하나 또는 둘 다없는 폴더는 무시 됨).
Jaykul

3
대박! "Windows *"항목을 추가로 제외 하도록 (?!S)절만 수정했습니다 (?![SW]). (?=[vCF])우리가 실제로 관심을 갖는 유일한 키는 버전 루트와 .NET 4.0+의 "Full"및 "Client"키이기 때문에이 작업도 수행 할 수 있습니다 . ;)
키라 미수

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

이 답변이 설치되어 있으면 4.5가 반환되지 않습니다. @Jaykul의 대답은 재귀를 사용합니다.


5
gci 'HKLM : \ SOFTWARE \ Microsoft \ NET Framework 설치 \ NDP'| pschildname -des 정렬 | foreach-object {$ _. name; $ _. GetValue ( "Version");}
MattUebel

나를 위해 대답은 지금 위에 있으므로 여기에 대한 링크 :-) : stackoverflow.com/a/3495491/1747983
Tilo

1
Windows 10에 .NET 4.7.1을 설치했지만 여전히 v4.0을 반환합니다.
Matt

24

스크립트에 v4.8 지원이 추가되었습니다.

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

Version현재 PSH 사본이 사용하는 CLR 인스턴스를 제공합니다 ( 여기에 설명되어 있음 ).


3
.NET 4가 설치되어 있지만 PowerShell은 2.0 런타임 만 사용합니다. 그래서 그것은 실제로 여기서 도움이되지 않습니다.
Joey

@Johannes : Q에 대한 의견을 참조하십시오. 원하는 것에 대해 명시해야합니다.
Richard

9
Powershell 2.0 $PSVersionTable의 경우 실행중인 CLR PowerShell 버전을 찾는 데 사용할 수도 있습니다 .
Keith Hill

6
더 높은 버전은 어떻습니까? 내가 가진 .NET 4.7.1을 지금하고 스크립트가 항상 4.0.30319 목사 42000 반환
매트

@Matt 당신은 버전의 작은 부분을 번역해야합니다 ... Powershell의 구성에 설정된 내용에 따라 최신 마이너 / 패치 버전을 사용하지 않을 수 있습니다.
Richard

13

올바른 구문 :

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

GetSystemVersion함수는 다음과 같은 문자열을 반환합니다.

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

또는 이런

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

$PSVersionTable읽기 전용 개체입니다. CLRVersion 속성은 다음과 같은 구조화 된 버전 번호입니다.

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

1
win8에서 이것을 시도했지만 아무것도 반환하지 않습니다. Windows 7에서는 4.5.1이 이미 설치되어있는 동안 2를 반환합니다. 왜 이것이 새로운 플랫폼에서 사용할 수 없는지 모르겠습니다. win sesrver 2008에서는 작동합니다.
최대

첫 번째 옵션은 Windows 8 64 비트 환경에서 작동합니다. 두 번째 옵션은 작동하지만 현재 PowerShell 인스턴스가 실행되는 .NET 버전을 보여줍니다. 거의 항상 최신 버전입니다. (편집 : 아마 둘 다 할 것입니다.)
Vimes

여기에서도 마찬가지입니다. Windows 7에서는 .net 2.0과 4.0이 모두 있지만 명령에는 v2.0.50727 만 표시됩니다. Jaykul의 접근 방식을 사용하십시오.
최대

Clr 버전은 프레임 워크 버전과 같지 않습니다. 4+ 프레임 워크는 모두 4 clr을 기반으로합니다
janv8000

더 높은 버전은 어떻습니까? 내가 가진 .NET 4.7.1을 지금하고 스크립트가 항상 4.0.30319 목사 42000 반환
매트

11

osx의 powershell에서 탭 완성을 통해 이것을 발견했습니다.

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


1
예, .NET Framework 4.7.2558.0을 반환 하지만 어떻게 4.7을 4.7.1과 구별 할 수 있습니까 ? (Windows 10 컴퓨터에는 4.7.1이 있습니다).
Matt

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



2

좋은 해결책

다운로드 가능한 DotNetVersionLister 모듈 (레지스트리 정보 및 일부 버전-마케팅-버전 룩업 테이블을 기반으로)을 사용해보십시오 .

다음과 같이 사용됩니다.

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        :

또는 .NET Framework> = 4. *에 대해서만 테스트하려는 경우 다음과 같이하십시오 .

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

그러나 호환되지 않기 때문에 PS v2.0 ( Win 7 , Win Server 2010 표준) 과 같이 작동하지 않습니다 (설치 / 가져 오기) .

아래의 "레거시"기능에 대한 동기

(이 글을 건너 뛰고 아래 코드를 사용할 수 있습니다)

일부 컴퓨터 에서는 PS 2.0 으로 작업 해야했고 위의 DotNetVersionLister를 설치 / 가져올 수 없었 습니다 .
다른 컴퓨터 에서는 두 개의 회사 사용자 지정 및 의 도움으로 PS 2.0 에서 PS 5.1 ( .NET Framework> = 4.5 필요 ) 로 업데이트하려고했습니다 . 관리자에게 설치 / 업데이트 프로세스를 잘 안내하려면 기존의 모든 컴퓨터 및 PS 버전에서이 기능으로 .NET 버전을 결정해야합니다. 따라서 우리는 아래 기능을 사용하여 모든 환경에서 더 안전하게 결정했습니다 ...Install-DotnetLatestCompanyInstall-PSLatestCompany

레거시 PS 환경을위한 기능 (예 : PS v2.0 )

따라서 다음 코드와 아래 (추출 된) 사용 예제가 여기에 유용합니다 (여기의 다른 답변을 바탕으로).

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

사용법 예 :

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

타이밍 사용을 보지 않으려면(Get-DotNetVersion -LocalHost -nosummary).">=4.x"
ΩmegaMan

@ ΩmegaMan : thx-위의 답변에서 좋은 추천을 업데이트했습니다 :)
Andreas Dietrich

1

예쁘지 않은. 확실히 예쁘지 않은 :

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

이것은 작동하거나 작동하지 않을 수 있습니다. 그러나 최신 버전에 관한 한, 이전 버전 (1.0, 1.1)의 경우 빈 폴더가 있지만 새로운 폴더는 없어야하므로 적절한 프레임 워크가 설치되면 나타납니다.

그래도 더 좋은 방법이 있어야한다고 생각합니다.


"V [.0-9] +"는 .NET 폴더 (일부 다른 폴더가 있음)와 일치하도록 제한해야합니다. 그런 다음 실제 설치가 있는지 확인하십시오. 설치된 구성 요소의 WMI가 더 쉬울 수 있습니다.
Richard

흠 ..이 머신에는 다른 폴더도 몇 개 있습니다. 다른 머신에는 다른 파일들만있었습니다. 그러나이 전체 답변은»works for me«의 사례에 더 가깝습니다. 그 정보를 얻는 신뢰할 수 있고 의도 된 방법이 있다고 확신합니다.
Joey

6
psake (빌드 자동화 도구)도 비슷한 접근 방식을 취하여 성공적으로 사용합니다 (또는 문제로 인해 아무도 변경하지 않았습니다). 그러나 그들이 풀 프레임 워크 버전을 필요로하지 않는다는 것은 사실입니다 ... 내 컴퓨터의 경우 더 가까워집니다 :ls $Env:windir\Microsoft.NET\Framework | ? { $_.PSIsContainer -and $_.Name -match '^v\d.[\d\.]+' } | % { $_.Name.TrimStart('v') }
stej

답변에있는 모든 라이너 중 stej가 제공하는 것이 가장 깨끗하고 예상대로 작동합니다. 답이된다면 투표했을 것입니다.
Bratch

불행히도, 그것은 신뢰할 수 없습니다. 내가 가진 .NET 4.7.1을 지금하고 스크립트가 항상 v4.0.30319을 반환합니다.
Matt

0

컴퓨터에 Visual Studio를 설치 한 경우 Visual Studio Developer 명령 프롬프트를 열고 다음 명령을 입력하십시오. clrver

해당 컴퓨터에 설치된 모든 .NET Framework 버전이 나열됩니다.


이 명령은 .NET Framework 버전이 아닌 CLR 버전을 가져옵니다.
user11909

0

다음 은 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.' }
    }
)"

이 예제는 모든 PowerShell 버전에서 작동하며 4.8이 마지막 .NET Framework 버전이므로 영구적으로 작동합니다.


-1

일반적인 아이디어는 다음과 같습니다.

.NET Framework 디렉토리에서 이름이 패턴 v number dot number 와 일치하는 컨테이너 인 하위 항목을 가져옵니다 . 내림차순으로 정렬하고 첫 번째 객체를 가져 와서 name 속성을 반환합니다.

스크립트는 다음과 같습니다.

(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

4.6.1을 설치했지만 스크립트가 v4.0.30319를 반환합니다.
rob

내 컴퓨터에서 작동하지 않습니다 (4.7.1이 설치되어 있음). v4.0.30319
Matt

-1

PowerShell 에서이 작업을 시도했습니다.

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


그것은 당신에게 진실을 말하지 않습니다. 제품 버전이 4.7.2 인 경우 예를 들어 4.7.03056과 같은 버전 번호가 표시됩니다.
Jaykul

-2

PowerShell 구문을 사용하지 않지만 System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion ()을 호출 할 수 있다고 생각합니다 . 이것은 버전을 문자열로 반환합니다 (와 같은 v2.0.50727것 같아요).


2
현재 실행중인 런타임의 경우 반드시 최신 설치 런타임 일 필요는 없습니다.
Joey

powershell의 경우 올바른 구문은 다음 [System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion()과 같습니다 . 그러나 v4.6이 설치되어 있어도 v4.0.30319 만 반환합니다.
Matt

@matt 4.0.30319는 .Net Framework 4.0에서 .Net Framework 4.7.1까지의 CLR 버전입니다. 따라서 v4.6 프레임 워크는 실제로 4.0.30319를 CLR 버전으로 사용합니다. 버전의 개정 부분 만 모든 .Net Frameworks의 차이점에 유의하십시오. 참조 : .NET Framework 버전 및 종속성 - 마이크로 소프트 문서 도구
walterlv

@walterlv-링크 주셔서 감사합니다. 네, 알고 있습니다. Microsoft는 큰 실수를 저질렀습니다. 서버에 원격으로 연결하고 실제로 설치된 .net 버전을 찾는 것은 쉽지 않습니다. 관리자와 개발자에게 또 다른 큰 두통.
Matt

그리고이 힘의 도움이 아니라 : 마이크로 소프트 : 버전 및 .NET 프레임 워크의 서비스 팩 수준을 확인하는 방법 . 또한 컴퓨터에 정확히 무엇이 설치되어 있는지 알아내는 것이 얼마나 복잡한 지 보여줍니다 ... :-(
Matt

-2

이것은 이전 게시물의 파생물이지만 내 테스트에서 최신 버전의 .net 프레임 워크 4를 얻습니다.

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

원격 컴퓨터에 대한 명령을 호출 할 수 있습니다.

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

ADModule 및 명명 규칙 접두사를 사용하여 이러한 가능성을 설정합니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.