¿Cuál sería un script 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 una línea para devolver solo la última versión para cada instalación de .NET [en cada línea].
.net
powershell
version
MattUebel
fuente
fuente
asp.net -v
Respuestas:
Si va a utilizar el registro, debe repetir para obtener la versión completa de 4.x Framework. 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 bajo 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 de nuevo, por lo que ahora hay un buen artículo de MSDN aquí que explica cómo convertir el valor de Release a un número de versión .Net, es un choque total de trenes :-(
Esto me parece correcto (tenga en cuenta que genera números de versión separados para WCF y WPF en 3.0. No sé de qué se trata). También genera tanto Cliente como Completo en 4.0 (si tiene ambos instalados):
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 versiones posteriores a la 4.5:
De hecho, ya que tengo que actualizar esta respuesta, aquí hay un script para generar el script anterior (con un poco más) de la fuente de descuento para esa página web. Esto probablemente se romperá en algún momento, por lo que mantendré la copia actual anterior.
fuente
'^(?!S)\p{L}'
expresión regular y obteniendo la información de Versión y Lanzamiento. ¿Qué es exactamente esa expresión regular tratando de calificar?PSChildName
es el nombre de la hoja de la clave de registro.\p{L}
es cualquier carácter de la categoría "letra" de Unicode.(?!S)
es un aspecto negativo y^
es el comienzo de la cadena. Entonces tiene que comenzar con una letra diferente aS
. Entonces, si considera solo ASCII, es lo mismo que$_.PSChildName -cmatch '^[A-RT-Za-z]'
(tenga en cuenta el-cmatch
). Por lo tanto, encuentra claves donde el nombre comienza con una letra distinta deS
. No tengo idea de por qué te importaría no ser ASCII si estás filtrando nombres que comienzan conS
... Definitivamente contigo porque es tan confuso.Get-ItemProperty -name Version,Release -EA 0
está haciendo. Sé que-EA 0
es lo mismo-ErrorAction SilentlyContinue
, pero ¿qué efecto tendríaGet-ItemProperty -name Version,Release
al canalizar todos los resultados? No parece quitar ninguna variable del objeto, ya que otras se usan en comandos posteriores en la tubería. ¿Se ejecuta, se produce un error cuando falta el nombreVersion
oRelease
de la clave y luego pasa los objetos donde tuvo éxito al siguiente comando en la tubería?(?!S)
cláusula para(?![SW])
excluir aún más las entradas de "Windows *". Esto también se puede hacer(?=[vCF])
ya que las únicas claves que realmente nos interesan son las raíces de la Versión y las claves "Completa" y "Cliente" para .NET 4.0+. ;)Esta respuesta no devuelve 4.5 si está instalada. La respuesta a continuación de @Jaykul y el uso de recurse sí.
fuente
Se agregó soporte v4.8 al script:
fuente
Le da una instancia de
Version
CLR que está utilizando la copia actual de PSH (como se documenta aquí ).fuente
$PSVersionTable
para encontrar la versión de CLR en la que se ejecuta PowerShell.Sintaxis correcta:
La
GetSystemVersion
función devuelve una cadena como esta:o así
$PSVersionTable
es un objeto de solo lectura. La propiedad CLRVersion es un número de versión estructurado como este:fuente
Encontré esto al completar la pestaña en powershell para osx:
[System.Runtime.InteropServices.RuntimeInformation]::get_FrameworkDescription() .NET Core 4.6.25009.03
fuente
[version]([Runtime.InteropServices.RuntimeInformation]::FrameworkDescription -replace '^.[^\d.]*','')
No hay una forma confiable de hacer esto para todas las plataformas y arquitecturas utilizando un script simple. Si desea aprender cómo hacerlo de manera confiable, comience en la publicación del blog Código de detección actualizado de .NET Framework de muestra que realiza una verificación más profunda .
fuente
Consulte la página Script para encontrar qué versiones de .NET están instaladas en estaciones de trabajo remotas .
El script allí puede ser útil para encontrar la versión .NET para múltiples máquinas en una red.
fuente
Buena solución
Intente usar el módulo descargable DotNetVersionLister (basado en información de registro y alguna tabla de búsqueda de versión a versión de marketing).
Que se usaría así:
O de esta manera si solo quiere probarlo para algún marco .NET> = 4. * :
Pero no funcionará (instalar / importar), por ejemplo, con PS v2.0 ( Win 7 , Win Server 2010 estándar) debido a la incompatibilidad ...
Motivación para las funciones "heredadas" a continuación
(Puede omitir leer esto y usar el código a continuación)
Tuvimos que trabajar con PS 2.0 en algunas máquinas y no pudimos instalar / importar el DotNetVersionLister anterior .
En otras máquinas, queríamos actualizar (desde PS 2.0 ) a PS 5.1 (que a su vez necesita .NET Framework> = 4.5 ) con la ayuda de dos compañías personalizadas
Install-DotnetLatestCompany
yInstall-PSLatestCompany
.Para guiar bien a los administradores a través del proceso de instalación / actualización, tendríamos que determinar la versión .NET en estas funciones en todas las máquinas y versiones PS existentes.
Por lo tanto, también utilizamos las siguientes funciones para determinarlas de manera más segura en todos los entornos ...
Funciones para entornos de PS heredados (por ejemplo, PS v2.0 )
Por lo tanto, el siguiente código y los siguientes ejemplos de uso (extraídos) son útiles aquí (basados en otras respuestas aquí):
Ejemplo de uso:
fuente
(Get-DotNetVersion -LocalHost -nosummary).">=4.x"
No es bonito. Definitivamente no es bonito:
Esto puede o no funcionar. Pero en lo que respecta a la última versión, esto debería ser bastante confiable, ya que hay carpetas esencialmente vacías para las versiones antiguas (1.0, 1.1) pero no las más nuevas, que solo aparecen una vez que se instala el marco apropiado.
Aún así, sospecho que debe haber una mejor manera.
fuente
ls $Env:windir\Microsoft.NET\Framework | ? { $_.PSIsContainer -and $_.Name -match '^v\d.[\d\.]+' } | % { $_.Name.TrimStart('v') }
Si ha instalado Visual Studio en su máquina, abra el símbolo del sistema del desarrollador de Visual Studio y escriba el siguiente comando: clrver
Enumerará todas las versiones instaladas de .NET Framework en esa máquina.
fuente
Aquí está mi opinión sobre esta pregunta siguiendo la documentación de msft :
Este ejemplo funciona con todas las versiones de PowerShell y funcionará a perpetuidad ya que 4.8 es la última versión de .NET Framework.
fuente
Aquí está la idea general:
Obtenga elementos secundarios en el directorio de .NET Framework que son contenedores cuyos nombres coinciden con el patrón v número número de punto . Ordénelos por nombre descendente, tome el primer objeto y devuelva su propiedad de nombre.
Aquí está el guión:
fuente
Probaría este en PowerShell: ¡funcionó para mí!
(Get-ItemProperty "HKLM: Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full"). Versión
fuente
No estoy al tanto de mi sintaxis de PowerShell, pero creo que podría llamar a System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion () . Esto devolverá la versión como una cadena (algo así
v2.0.50727
, creo).fuente
[System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion()
pero solo devuelve v4.0.30319, aunque v4.6 está instalado en mi caso.Esta es una derivación de la publicación anterior, pero esta obtiene la última versión de .NET Framework 4 en mis pruebas.
Lo que le permitirá invocar-comando a la máquina remota:
Lo que configura esta posibilidad con ADModule y el prefijo de convención de nomenclatura:
fuente