Сценарий PowerShell для возврата версий .NET Framework на компьютере?

182

Что такое сценарий PowerShell для возврата версий .NET Framework на компьютере?

Мое первое предположение - это что-то, связанное с WMI. Есть ли что-то лучше?

Это должен быть однострочник, чтобы возвращать только последнюю версию для каждой установки .NET [в каждой строке].

MattUebel
источник
7
Машина может (и будет) иметь несколько версий Fx. Как вы хотите справиться с этим? И затем есть беспорядок Fx2 .. Fx3.5SP1. Какую версию вы хотите услышать?
Хенк Холтерман
Я полагаю, что необходимо будет возвращать полный номер версии для каждой установки.
MattUebel
1
Разве нет способа сделать это через WMI?
Марк Ричман
Вы просили PowerShell, я сделал что-то для C # (консольное приложение). Если вам интересно, вот оно ...
Мэтт
Это действительно невероятно, что нет ничего подобного:asp.net -v
Altimus Prime

Ответы:

354

Если вы собираетесь использовать реестр, вам нужно выполнить рекурсию, чтобы получить полную версию для 4.x Framework. Предыдущие ответы оба возвращают номер root в моей системе для .NET 3.0 (где номера WCF и WPF, вложенные в 3.0, выше - я не могу этого объяснить) и не возвращают ничего для 4.0 .. ,

РЕДАКТИРОВАТЬ: Для .Net 4.5 и выше, это снова немного изменилось, так что теперь есть хорошая статья MSDN, объясняющая, как преобразовать значение Release в номер версии .Net, это полный крушение поезда :-(

Это выглядит правильно для меня (обратите внимание, что он выводит отдельные номера версий для WCF и WPF на 3.0. Я не знаю, о чем это). Он также выводит как Client, так и Full на 4.0 (если они оба установлены):

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 }}
"@
Jaykul
источник
Это именно то, что я тоже ищу, но мне трудно сосредоточиться на том, что именно это делает. Из того, что я понимаю, это выход в реестр NDP и рекурсивный поиск по каждой папке, которая соответствует '^(?!S)\p{L}'регулярному выражению, и получение информации о версии и выпуске. Что именно это регулярное выражение пытается определить?
Джонрад
2
@Johnrad PSChildName- это конечное имя раздела реестра. \p{L}это любой символ в категории Unicode «буква». (?!S)является отрицательным взглядом вокруг, и ^является началом строки. Так что это должно начинаться с буквы, отличной от S. Так что если вы рассматриваете только ASCII, это то же самое, что $_.PSChildName -cmatch '^[A-RT-Za-z]'(обратите внимание на -cmatch). Таким образом, он находит ключи, где имя начинается с буквы, отличной от S. Я понятия не имею, почему вы будете заботиться о не-ASCII, если вы отфильтровываете имена, начинающиеся с S... Определенно, из-за вас это так запутанно.
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 возвращает значения (в частности: «Версия» и «Выпуск») - мы игнорируем ошибки, потому что нам не нужны папки, у которых нет этих значений. Так что да, в основном мы находим КАЖДУЮ подпапку, а затем ищем версию или выпуск (любые папки без одной или обеих из них игнорируются).
Джайкуль
3
Потрясающие! Я только изменил (?!S)предложение, (?![SW])чтобы исключить записи «Windows *». Это также можно сделать, (?=[vCF])поскольку единственные ключи, которые нас действительно волнуют, - это корни версии и ключи «Полный» и «Клиент» для .NET 4.0+. ;)
Chiramisu
27
gci 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' |
sort pschildname -des                                  |
select -fi 1 -exp pschildname

Этот ответ не возвращает 4.5, если он установлен. Ответ ниже от @Jaykul и с помощью recurse делает.

Джейсон Стангрум
источник
5
gci 'HKLM: \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP' | сортировать имя_псч -дес | foreach-object {$ _. name; $ _. GetValue ("Версия");}
MattUebel
для меня ответ теперь сверху, так что вот ссылка на него :-): stackoverflow.com/a/3495491/1747983
Тило
1
Установив .NET 4.7.1 на Windows 10, он по-прежнему возвращает v4.0.
Мэтт
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" }
      }
    }
}
AlexBar
источник
21
[environment]::Version

Дает вам экземпляр Versionдля CLR, который используется текущей копией PSH (как описано здесь ).

Ричард
источник
3
У меня установлен .NET 4, но PowerShell будет использовать только среду выполнения 2.0. Так что это не очень помогает здесь.
Джои
@ Йоханнес: См. Комментарий к вашему Q, вы должны четко указать, что вы хотите.
Ричард
9
Для Powershell 2.0 вы также можете использовать $PSVersionTableверсию CLR, на которой работает PowerShell.
Кит Хилл
6
Как насчет более высоких версий? У меня сейчас .NET 4.7.1 , и скрипт всегда возвращает 4.0.30319 Rev. 42000.
Мэтт
@Matt вам нужно будет перевести второстепенную часть версии ... и учтите, что в зависимости от того, что установлено в конфигурации Powershell, возможно, он не использует последнюю минорную версию / версию патча.
Ричард
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 возвращается 2, а 4.5.1 уже установлена. Я не знаю, почему это нельзя использовать на новых платформах. На win sesrver 2008 это работает.
максимум
Первый вариант работает в моей Windows 8, 64-битной среде. Второй вариант работает, но я думаю, что он показывает только версию .NET, в которой работает текущий экземпляр PowerShell, которая почти всегда является самой последней. (Редактировать: Может быть, они оба делают.)
Vimes
тоже самое. на Windows 7 у меня есть .net 2.0 и 4.0, но команда показывает только v2.0.50727. Используйте подход Jaykul.
максимум
Версия Clr не равна версии фреймворка, 4+ фреймворки основаны на 4 clr
janv8000
Как насчет более высоких версий? У меня сейчас .NET 4.7.1 , и скрипт всегда возвращает 4.0.30319 Rev. 42000.
Мэтт
11

Я нашел это через завершение вкладки в powershell для osx:

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

js2010
источник
1
Да, он возвращает .NET Framework 4.7.2558.0 - но как отличить 4.7 от 4.7.1 (у меня на компьютере с Windows 10 установлен 4.7.1).
Мэтт
1
[version]([Runtime.InteropServices.RuntimeInformation]::FrameworkDescription -replace '^.[^\d.]*','')
Рабаш
3

Не существует надежного способа сделать это для всех платформ и архитектур с использованием простого сценария. Если вы хотите узнать, как сделать это надежно, начните с публикации в блоге Обновленный образец кода обнаружения .NET Framework, который выполняет более глубокую проверку .

x0n
источник
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 ) с помощью двух пользовательских Install-DotnetLatestCompanyи Install-PSLatestCompany.
Чтобы хорошо провести администраторов через процесс установки / обновления, нам нужно определить версию .NET в этих функциях на всех машинах и существующих версиях PS.
Таким образом, мы использовали также следующие функции, чтобы определить их более безопасно во всех средах ...

Функции для устаревших сред 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 на установленных компонентах может быть проще.
Ричард
Хм, верно ... на этой машине также есть несколько других папок - у меня на другой машине была только куча других файлов. Однако весь этот ответ был скорее делом «работает для меня». Я уверен, что есть надежный и намеченный способ получения этой информации.
Джои
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.
Мэтт
0

Если вы установили Visual Studio на свой компьютер, откройте командную строку разработчика Visual Studio и введите следующую команду: clrver

В нем будут перечислены все установленные версии .NET Framework на этом компьютере.

Абдул Рауф
источник
Эта команда получает версию CLR, а не версию .NET Framework, которая отличается.
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 число точка число . Отсортируйте их по убыванию имени, возьмите первый объект и верните его свойство 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
грабить
Это не работает на моей машине (у меня установлен 4.7.1). Это печатает v4.0.30319
Мэтт
-1

Я хотел бы попробовать это в PowerShell: работал для меня!

(Get-ItemProperty "HKLM: Программное обеспечение \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full"). Версия

гигабайт
источник
Это не говорит вам правду. Номер версии там скажет, например, 4.7.03056, когда версия продукта 4.7.2
Jaykul
-2

Я не разбираюсь в моем синтаксисе PowerShell, но думаю, что вы могли бы просто вызвать System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion () . Это вернет версию в виде строки (что-то вроде v2.0.50727, я думаю).

Энди
источник
2
Для исполняемой в данный момент среды выполнения, не обязательно самой последней установленной.
Джои
Для powershell правильный синтаксис:, [System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion()но он просто возвращает v4.0.30319, даже если v4.6 установлен в моем случае.
Мэтт
@matt 4.0.30319 - это версия CLR от .Net Framework 4.0 до .Net Framework 4.7.1. Таким образом, ваша платформа v4.6 фактически использует 4.0.30319 в качестве своей версии CLR. Обратите внимание, что только версия Revision версии является разницей между всеми .Net Frameworks. См. Также: Версии и зависимости .NET Framework - Документы Microsoft
walterlv
@walterlv - Спасибо за ссылку. Да, я знаю об этом. Microsoft сделала большую ошибку, потому что нелегко удаленно подключиться к серверу и выяснить, какая именно версия .net на самом деле там установлена. Еще одна большая головная боль для администраторов и разработчиков.
Мэтт
И это также может помочь: Microsoft: Как определить версии и уровни пакетов обновления .NET Framework . Это также показывает, насколько сложно было выяснить, что именно установлено на вашей машине ... :-(
Мэтт
-2

Это производный от предыдущего поста, но в моих тестах он получил последнюю версию .net framework 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
Билл Кертис
источник