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

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

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

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

169
задан Peter Mortensen 20 November 2014 в 09:45
поделиться

6 ответов

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

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

Мне это кажется правильным (обратите внимание, что он выводит отдельные номера версий для WCF и WPF на 3.0. Я не знаю, о чем это). Он также выводит оба Клиент и Полный в 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-Oject 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 }}
"@
333
ответ дан 23 November 2019 в 20:49
поделиться
[environment]::Version

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

22
ответ дан 23 November 2019 в 20:49
поделиться

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

-2
ответ дан 23 November 2019 в 20:49
поделиться
gci 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' |
sort pschildname -des                                  |
select -fi 1 -exp pschildname

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

27
ответ дан 23 November 2019 в 20:49
поделиться

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

4
ответ дан 23 November 2019 в 20:49
поделиться

Не очень. Определенно некрасиво:

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

Это может сработать, а может и не сработать. Но что касается последней версии, это должно быть довольно надежно, поскольку для старых версий (1.0, 1.1) есть практически пустые папки, но не для новых - они появляются только после установки соответствующей структуры.

Тем не менее, я подозреваю, что должен быть способ получше.

2
ответ дан 23 November 2019 в 20:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: