Respuestas:
Use $PSVersionTable.PSVersion
para determinar la versión del motor. Si la variable no existe, es seguro asumir que el motor es la versión 1.0
.
Tenga en cuenta que $Host.Version
y (Get-Host).Version
no son confiables: reflejan solo la versión del host, no el motor. PowerGUI, PowerShellPLUS, etc. son aplicaciones de alojamiento y configurarán la versión del host para que refleje la versión de su producto, lo cual es completamente correcto, pero no lo que está buscando.
PS C:\> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
4 0 -1 -1
$PSVersionTable
es más confiable y devuelve $ PSVersion. También puedes usar $PSVersionTable.PSVersion
. Incluso si está conectado de forma remota a la máquina que ejecuta una versión diferente ( invoke-command -computername myRemotePC -Credential foo {$host}
), parece $host
que solo mostrará la versión más baja que acordaron para la serialización. Mientras $PSVersionTable
mostrará la versión verdadera. Espero que ayude a alguien ...
notepad $profile
y me tiré function psver { $PSVersionTable; $PSVersionTable.PSVersion }
. Una recarga . $profile
y puedo escribir en psver
cualquier momento para obtener la información detallada de la versión y otros detalles.
Me gustaría utilizar ya sea Get-Host o $ PSVersionTable . Como señala Andy Schneider, $PSVersionTable
no funciona en la versión 1; Se introdujo en la versión 2.
get-host
Name : ConsoleHost
Version : 2.0
InstanceId : d730016e-2875-4b57-9cd6-d32c8b71e18a
UI : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture : en-GB
CurrentUICulture : en-US
PrivateData : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace : System.Management.Automation.Runspaces.LocalRunspace
$PSVersionTable
Name Value
---- -----
CLRVersion 2.0.50727.4200
BuildVersion 6.0.6002.18111
PSVersion 2.0
WSManStackVersion 2.0
PSCompatibleVersions {1.0, 2.0}
SerializationVersion 1.1.0.1
PSRemotingProtocolVersion 2.1
$host.version
no es confiable - por ejemplo en PowerGUI, devuelve la versión anfitrión PowerGUI que no es el mismo que la versión del motor powershell (que es lo que se desea.)
Usted puede mirar en el incorporado en la variable, $psversiontable
. Si no existe, tienes V1. Si existe, le dará toda la información que necesita.
1 > $psversiontable
Name Value
---- -----
CLRVersion 2.0.50727.4927
BuildVersion 6.1.7600.16385
PSVersion 2.0
WSManStackVersion 2.0
PSCompatibleVersions {1.0, 2.0}
SerializationVersion 1.1.0.1
PSRemotingProtocolVersion 2.1
Para determinar si PowerShell está instalado, puede verificar la existencia de
HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install
y
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3
y, si existe, si el valor es 1 (para instalado), como se detalla en la publicación del blog Compruebe si PowerShell está instalado y la versión .
Para determinar la versión de PowerShell que está instalada, puede verificar las claves de registro
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine\PowerShellVersion
y
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine\PowerShellVersion
Para determinar la versión de PowerShell que se instala desde un script .ps1, puede usar la siguiente línea, como se detalla en PowerShell.com en la versión de PowerShell que estoy ejecutando .
$isV2 = test-path variable:\psversiontable
El mismo sitio también ofrece una función para devolver la versión:
function Get-PSVersion {
if (test-path variable:psversiontable) {$psversiontable.psversion} else {[version]"1.0.0.0"}
}
Puede verificar directamente la versión con una sola línea invocando PowerShell externamente , como desde el símbolo del sistema
powershell -Command "$PSVersionTable.PSVersion"
Según @psaul , en realidad puede tener un comando que sea independiente de su origen (CMD, PowerShell o Pwsh). Gracias por eso.
powershell -command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
Lo probé y funcionó perfectamente tanto en CMD como en PowerShell.
cmd
y powershell
en vano. Hubiera esperado el mismo comportamiento también. :)
pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
Funciona genial.
Puede verificar que la versión de Windows PowerShell esté instalada completando la siguiente verificación:
En la consola de Windows PowerShell, escriba el siguiente comando en el símbolo del sistema y luego presione ENTRAR:
Get-Host | Select-Object Version
Verá una salida similar a esta:
Version
-------
3.0
http://www.myerrorsandmysolutions.com/how-to-verify-the-windows-powershell-version-installed/
El método compatible con reenvío recomendado de Microsoft para verificar si PowerShell está instalado y determinar la versión instalada es mirar dos claves de registro específicas. He reproducido los detalles aquí en caso de que se rompa el enlace.
Según la página vinculada:
Dependiendo de cualquier otra clave de registro o versión de PowerShell.exe o la ubicación de PowerShell.exe no se garantiza que funcione a largo plazo.
Para verificar si hay instalada alguna versión de PowerShell, verifique el siguiente valor en el registro:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
Para verificar si la versión 1.0 o 2.0 de PowerShell está instalada, verifique el siguiente valor en el registro:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
Encontré que la forma más fácil de verificar si estaba instalado era:
cmd
, luego OK)powershell
luego presione regresar. Entonces debería obtener el PS
indicador de PowerShell :C:\Users\MyUser>powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.
PS C:\Users\MyUser>
Luego puede verificar la versión desde el indicador de PowerShell escribiendo $PSVersionTable.PSVersion
:
PS C:\Users\MyUser> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
2 0 -1 -1
PS C:\Users\MyUser>
Escriba exit
si desea volver al símbolo del sistema ( exit
nuevamente si también desea cerrar el símbolo del sistema).
Para ejecutar scripts, consulte http://ss64.com/ps/syntax-run.html .
$host.version
es simplemente incorrecto / poco confiable. Esto le proporciona la versión del ejecutable de alojamiento (powershell.exe, powergui.exe, powershell_ise.exe, powershellplus.exe, etc.) y no la versión del motor en sí.
La versión del motor está contenida en $psversiontable.psversion
. Para PowerShell 1.0, esta variable no existe, por lo que, obviamente, si esta variable no está disponible, es completamente seguro asumir que el motor es 1.0, obviamente.
Utilizar:
$psVersion = $PSVersionTable.PSVersion
If ($psVersion)
{
#PowerShell Version Mapping
$psVersionMappings = @()
$psVersionMappings += New-Object PSObject -Property @{Name='5.1.14393.0';FriendlyName='Windows PowerShell 5.1 Preview';ApplicableOS='Windows 10 Anniversary Update'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.1.14300.1000';FriendlyName='Windows PowerShell 5.1 Preview';ApplicableOS='Windows Server 2016 Technical Preview 5'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.494';FriendlyName='Windows PowerShell 5 RTM';ApplicableOS='Windows 10 1511 + KB3172985 1607'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.122';FriendlyName='Windows PowerShell 5 RTM';ApplicableOS='Windows 10 1511 + KB3140743 1603'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.117';FriendlyName='Windows PowerShell 5 RTM 1602';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8.1, and Windows 7 SP1'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.63';FriendlyName='Windows PowerShell 5 RTM';ApplicableOS='Windows 10 1511 + KB3135173 1602'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.51';FriendlyName='Windows PowerShell 5 RTM 1512';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8.1, and Windows 7 SP1'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.0.10514.6';FriendlyName='Windows PowerShell 5 Production Preview 1508';ApplicableOS='Windows Server 2012 R2'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.0.10018.0';FriendlyName='Windows PowerShell 5 Preview 1502';ApplicableOS='Windows Server 2012 R2'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.0.9883.0';FriendlyName='Windows PowerShell 5 Preview November 2014';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows 8.1'}
$psVersionMappings += New-Object PSObject -Property @{Name='4.0';FriendlyName='Windows PowerShell 4 RTM';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8.1, and Windows 7 SP1'}
$psVersionMappings += New-Object PSObject -Property @{Name='3.0';FriendlyName='Windows PowerShell 3 RTM';ApplicableOS='Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8, and Windows 7 SP1'}
$psVersionMappings += New-Object PSObject -Property @{Name='2.0';FriendlyName='Windows PowerShell 2 RTM';ApplicableOS='Windows Server 2008 R2 SP1 and Windows 7'}
foreach ($psVersionMapping in $psVersionMappings)
{
If ($psVersion -ge $psVersionMapping.Name) {
@{CurrentVersion=$psVersion;FriendlyName=$psVersionMapping.FriendlyName;ApplicableOS=$psVersionMapping.ApplicableOS}
Break
}
}
}
Else{
@{CurrentVersion='1.0';FriendlyName='Windows PowerShell 1 RTM';ApplicableOS='Windows Server 2008, Windows Server 2003, Windows Vista, Windows XP'}
}
Puede descargar la secuencia de comandos detallada de Cómo determinar la versión instalada de PowerShell .
La forma más fácil de olvidar esta página y nunca volver a ella es aprender Get-Variable
:
Get-Variable | where {$_.Name -Like '*version*'} | %{$_[0].Value}
No hay necesidad de recordar todas las variables. Solo Get-Variable
es suficiente (y "Debe haber algo sobre la versión").
$PSVersionTable
Para verificar si PowerShell está instalado, use:
HKLM\Software\Microsoft\PowerShell\1 Install ( = 1 )
Para verificar si RC2 o RTM está instalado, use:
HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-00301) -- For RC2
HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-04309) -- For RTM
Fuente: este sitio web .
Como la respuesta más útil no abordaba la parte de si existe , pensé en darle una opinión a través de una solución rápida y sucia. Se basa en que PowerShell esté en la variable de entorno de ruta , que es probablemente lo que desea. (Sugerencia para la respuesta principal, ya que no lo sabía). Pegue esto en un archivo de texto y asígnele un nombre
Prueba Powershell Version.cmd
o similar.
@echo off
echo Checking powershell version...
del "%temp%\PSVers.txt" 2>nul
powershell -command "[string]$PSVersionTable.PSVersion.Major +'.'+ [string]$PSVersionTable.PSVersion.Minor | Out-File ([string](cat env:\temp) + '\PSVers.txt')" 2>nul
if errorlevel 1 (
echo Powershell is not installed. Please install it from download.Microsoft.com; thanks.
) else (
echo You have installed Powershell version:
type "%temp%\PSVers.txt"
del "%temp%\PSVers.txt" 2>nul
)
timeout 15
Necesitaba verificar la versión de PowerShell y luego ejecutar el código apropiado. Algunos de nuestros servidores ejecutan v5 y otros v4. Esto significa que algunas funciones, como comprimir, pueden o no estar disponibles.
Esta es mi solución:
if ($PSVersionTable.PSVersion.Major -eq 5) {
#Execute code available in PowerShell 5, like Compress
Write-Host "You are running PowerShell version 5"
}
else {
#Use a different process
Write-Host "This is version $PSVersionTable.PSVersion.Major"
}
El siguiente cmdlet devolverá la versión de PowerShell.
$PSVersionTable.PSVersion.Major
$PSVersionTable
es una variable automática; un objeto. No es un cmdlet.
Este es el resultado de búsqueda superior para "Archivo Batch obtener versión de PowerShell", por lo que me gustaría proporcionar un ejemplo básico de cómo hacer un flujo condicional en un archivo por lotes dependiendo de la versión de Powershell
Ejemplo genérico
powershell "exit $PSVersionTable.PSVersion.Major"
if %errorlevel% GEQ 5 (
echo Do some fancy stuff that only powershell v5 or higher supports
) else (
echo Functionality not support by current powershell version.
)
Ejemplo del mundo real
powershell "exit $PSVersionTable.PSVersion.Major"
if %errorlevel% GEQ 5 (
rem Unzip archive automatically
powershell Expand-Archive Compressed.zip
) else (
rem Make the user unzip, because lazy
echo Please unzip Compressed.zip prior to continuing...
pause
)
También puede llamar al comando "host" desde la línea de comandos de PowerShell. Debería darte el valor de la $host
variable.
host
resuelve a Get-Host
. De todos modos, no es una forma confiable de obtener la versión.
Extender la respuesta con un operador seleccionado:
Get-Host | select {$_.Version}
Get-Host
).