versiones todas tengo sistema saber que operativo net necesita las instalar framework este como admite .net powershell version

todas - Secuencia de comandos de PowerShell para devolver versiones de.NET Framework en una máquina?



net framework 3.5 windows 8.1 64 bits (12)

¡Intentaré este en PowerShell: funcionó para mí!

(Get-ItemProperty "HKLM: Software / Microsoft / NET Framework Setup / NDP / v4 / Full"). Versión

¿Qué sería una secuencia de comandos de PowerShell para devolver versiones de .NET Framework en una máquina?

Mi primera suposición es algo relacionado con WMI. ¿Hay algo mejor?

Debería ser de una sola línea devolver solo la última versión para cada instalación de .NET [en cada línea].


Aquí está la idea general:

Obtenga elementos secundarios en el directorio .NET Framework que son contenedores cuyos nombres coinciden con el número de punto del número de patrón v . Ordenarlos por nombre descendente, tomar el primer objeto y devolver su propiedad de nombre.

Aquí está el guió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



Corregir la sintaxis

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

La función GetSystemVersion devuelve una cadena como esta:

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

o así

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

$PSVersionTable es un objeto de solo lectura. La propiedad CLRVersion es un número de versión estructurada como este:

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


Encontré esto a través de la finalización de pestañas en powershell para osx:

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


No es bonito. Definitivamente no es bonito:

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

Esto puede o no funcionar. Pero en lo que se refiere a la última versión, esto debería ser bastante confiable, ya que existen esencialmente carpetas vacías para las versiones anteriores (1.0, 1.1) pero no las más recientes, que solo aparecen una vez que se instala el marco apropiado.

Aún así, sospecho que debe haber una mejor manera.


No estoy al tanto de mi sintaxis de PowerShell, pero creo que podría simplemente llamar a GetSystemVersion . Esto devolverá la versión como una cadena (algo así como v2.0.50727 , creo).



Se agregó soporte para v4.7.1 al script:

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" } {$_ -gt 461310} { [Version]"Undocumented version (> 4.7.1), please update script" } } } }


Si va a utilizar el registro, debe recurrir para obtener la versión completa del Marco 4.x. Las respuestas anteriores devuelven el número raíz en mi sistema para .NET 3.0 (donde los números WCF y WPF, que están anidados en 3.0, son más altos, no puedo explicar eso) y no devuelven nada para 4.0. .

EDITAR: para .Net 4.5 y versiones posteriores, esto cambió ligeramente nuevamente, por lo que ahora hay un buen artículo de MSDN que explica cómo convertir el valor de la versión a un número de versión .Net, es un accidente total del tren :-(

Esto me parece correcto (nótese que emite números de versión separados para WCF y WPF en 3.0. No sé de qué se trata). También emite tanto Client como Full en 4.0 (si tiene ambas instaladas):

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

Según el artículo de MSDN, puede crear una tabla de búsqueda y devolver el número de versión del producto de marketing para las versiones posteriores a 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'' } 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

De hecho, dado que tengo que actualizar esta respuesta, aquí hay un script para generar el guión anterior (con un poco más) del origen de la rebaja para esa página web. Es probable que esto se rompa en algún momento, por lo tanto, mantendré la copia actual arriba.

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


[environment]::Version

Le da una instancia de la Version para el CLR que está usando la copia actual de PSH (como se documenta here ).


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

Esta respuesta no devuelve 4.5 si está instalada. La respuesta a continuación de @Jaykul y el uso de recurse lo hace.