Determinar a versão instalada do PowerShell

2632

Como posso determinar qual versão do PowerShell está instalada em um computador e, de fato, se está instalada?

MagicAndi
fonte

Respostas:

3585

Use $PSVersionTable.PSVersionpara determinar a versão do mecanismo. Se a variável não existir, é seguro assumir que o mecanismo é a versão 1.0.

Observe que $Host.Versione (Get-Host).Versionnão são confiáveis ​​- eles refletem apenas a versão do host, não o mecanismo. O PowerGUI, o PowerShellPLUS etc. são todos aplicativos de hospedagem e definirão a versão do host para refletir a versão do produto - o que é totalmente correto, mas não o que você está procurando.

PS C:\> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      -1     -1
user156862
fonte
2
@DanielCassidy - dois anos atrasado para a festa, mas "alguns recursos estão inexplicavelmente indisponíveis" podem ser causados ​​por ter apenas a estrutura .Net 3.5 Compact instalada em vez de tudo.
Dave Neeley
83
$PSVersionTableé mais confiável e retorna $ PSVersion. Você também pode usar $PSVersionTable.PSVersion. Mesmo se você estiver conectado remotamente à máquina executando uma versão diferente ( invoke-command -computername myRemotePC -Credential foo {$host}), parece que $hostapenas mostrará a versão mais baixa que eles concordaram em serializar. Enquanto $PSVersionTablemostrará a versão verdadeira. Espero que ele iria ajudar alguém ..
Vulcan Raven
16
Parece que $ host.Version não é uma boa opção ... Se você faz o controle remoto para uma máquina executando o PowerShell 3, volta a 1.0, pois o RemotingHost parece ser a v1. O uso correto de $ PSVersionTable retorna 3.
Danny Tuppeny 30/10/12
25
@ Starfish O comando mostrado inicia o Powershell usando o Prompt de Comando. O comando não erro com "powershell não encontrado" se ele não estiver instalado?
jpmc26
9
Tão cansado de voltar aqui para isso que apenas corri notepad $profilee joguei function psver { $PSVersionTable; $PSVersionTable.PSVersion }nele. Recarregando . $profilee posso digitar a psverqualquer momento para obter informações detalhadas da versão e outros detalhes.
ADTC
434

Eu usaria Get-Host ou $ PSVersionTable . Como Andy Schneider aponta, $PSVersionTablenão funciona na versão 1; foi introduzido na versão 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
Thomas Bratt
fonte
5
obrigado! Nota: No meu XP, onde atualizei manualmente da v1 Powershell, os caminhos reais da pasta e do registro (enganosamente ?!) fazem referência à v1 NÃO à v2. É como os outros aqui especificam, mas foi por isso que fiquei tão preocupado se eu o havia instalado. Meu caminho é; C: \ WINDOWS \ system32 \ windowspowershell \ v1.0
AnneTheAgile
4
Se o $ psversiontable não existir, é totalmente seguro assumir que você está na v1.0 - e ei presto, isso também responde à sua pergunta. $host.versionnão é confiável - por exemplo, em PowerGUI, ele retorna a versão do host PowerGUI que não é o mesmo que a versão do motor PowerShell (que é o que é desejado.)
x0n
10
A resposta aceita declara "... $ Host.Version e (Get-Host) .Version não são confiáveis ​​- elas refletem apenas a versão do host, e não o mecanismo" .
Peter Mortensen
100

Você pode olhar para a variável incorporada $psversiontable,. Se não existir, você tem a V1. Se existir, ele fornecerá todas as informações necessárias.

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    
Andy Schneider
fonte
97

Para determinar se o PowerShell está instalado, você pode verificar a existência de

HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install

e

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3

e, se existir, se o valor é 1 (para instalado), conforme detalhado na postagem do blog Verifique se o PowerShell está instalado e a versão .

Para determinar a versão do PowerShell instalada, você pode verificar as chaves do Registro

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine\PowerShellVersion

e

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine\PowerShellVersion

Para determinar a versão do PowerShell instalada a partir de um script .ps1, você pode usar a seguinte linha, conforme detalhado no PowerShell.com em Qual versão do PowerShell estou executando .

$isV2 = test-path variable:\psversiontable

O mesmo site também fornece uma função para retornar a versão:

function Get-PSVersion {
    if (test-path variable:psversiontable) {$psversiontable.psversion} else {[version]"1.0.0.0"}
}
MagicAndi
fonte
4
Útil porque em um servidor Windows 2003 não consegui encontrar a entrada do menu Iniciar do PowerShell (estava lá, mas não é óbvia), mas a chave do registro respondeu à minha pergunta.
Holistic Developer
7
Para o PowerScript 3.0, parece haver uma nova entrada, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 (além de HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 ). O local apropriado nesse caso para obter a versão parece ser HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 \ PowerShellEngine \ PowerShellVersion (o valor da amostra é "3.0").
22613 Peter Mortensen
49

Você pode verificar diretamente a versão com uma linha apenas invocando o PowerShell externamente , como no prompt de comando

powershell -Command "$PSVersionTable.PSVersion"

De acordo com o @psaul, você pode realmente ter um comando independente de onde veio (CMD, PowerShell ou Pwsh). Obrigado por isso.

powershell -command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"

Eu testei e funcionou perfeitamente no CMD e no PowerShell.

Imagem

Patrick Bard
fonte
Eu recebo esse erro horrível com essa tentativa: "System.Collections.Hashtable.PSVersion: O termo 'System.Collections.Hashtable.PSVersion' não é reconhecido como o nome de um cmdlet, função, arquivo de script ou programa operável. ortografia do nome ou se um caminho foi incluído, verifique se o caminho está correto e tente novamente. ". Portanto, nem sempre funciona
Gonmator
Fico feliz que você tenha destacado isso, já que é bom conhecer os casos extremos, mas acho que ainda funciona para a maioria das pessoas.
Patrick Bard
@ Gonmator alguém poderia pensar que o PowerShell se comportaria da mesma maneira com esse comando, mas infelizmente não. Fiz uma tentativa de corrigir a sintaxe para trabalhar agnosticamente entre cmde powershellsem sucesso. Eu teria esperado o mesmo comportamento também. :)
tresf
3
@tresf (e @Gonmator), você PODE executá-lo de forma independente a partir do CMD, PowerShell ou Pwsh (PS 6.0), mas você precisa usar este formulário: powershell -comand "(Get-Variable PSVersionTable -ValueOnly) .PSVersion" (que irá trabalho em todos os casos)
PSaul
Testado no mac também. pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion" funciona bem.
tresf
38

Você pode verificar se a versão do Windows PowerShell foi instalada executando a seguinte verificação:

  1. Clique em Iniciar, clique em Todos os Programas, clique em Acessórios, clique em Windows PowerShell e, em seguida, clique em Windows PowerShell.
  2. No console do Windows PowerShell, digite o seguinte comando no prompt de comando e pressione ENTER:

    Get-Host | Select-Object Version

Você verá uma saída parecida com esta:

Version
-------
3.0

http://www.myerrorsandmysolutions.com/how-to-verify-the-windows-powershell-version-installed/

Eclipses
fonte
1
Você assume que o PowerShell foi instalado com opções padrão e que os atalhos não foram removidos do menu Iniciar. Melhor usar o teste de registro.
Xalorous 18/05
Eu acho que se você precisar usar o PowerShell primeiro, tente executá-lo como padrão; ele deve ser instalado; se você não encontrar o ícone, tente pesquisá-lo; talvez tente executá-lo no prompt de comando. Eu não acho que você começa a partir do registro.
Eclipses
6
A resposta aceita declara "... $ Host.Version e (Get-Host) .Version não são confiáveis ​​- elas refletem apenas a versão do host, e não o mecanismo" .
Peter Mortensen
21

O método compatível com encaminhamento recomendado pela Microsoft para verificar se o PowerShell está instalado e determinar a versão instalada é examinar duas chaves de registro específicas. Reproduzi os detalhes aqui, caso o link se quebre.

De acordo com a página vinculada:

Dependendo de outras chaves do Registro, versão do PowerShell.exe ou o local do PowerShell.exe, não é garantido que funcione a longo prazo.

Para verificar se alguma versão do PowerShell está instalada, verifique o seguinte valor no registro:

  • Localização da chave: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
  • Nome do valor: Instalar
  • Tipo de valor: REG_DWORD
  • Dados do valor: 0x00000001 (1

Para verificar se a versão 1.0 ou 2.0 do PowerShell está instalada, verifique o seguinte valor no registro:

  • Localização da chave: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
  • Nome do valor: PowerShellVersion
  • Tipo de valor: REG_SZ
  • Dados do valor: <1.0 | 2.0>
Estrela do Mar
fonte
5
Para o PowerShell 3.0, parece haver um novo, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 .
Peter Mortensen
11

Encontrei a maneira mais fácil de verificar se o instalado era:

  • execute um prompt de comando (Iniciar, Executar cmde OK)
  • digite powershelle pressione return. Você deve receber o PSprompt do PowerShell :

C:\Users\MyUser>powershell

Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\Users\MyUser>

Em seguida, você pode verificar a versão no prompt do PowerShell digitando $PSVersionTable.PSVersion:

PS C:\Users\MyUser> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1

PS C:\Users\MyUser>

Digite exitse você deseja voltar ao prompt de comando ( exitnovamente se também deseja fechar o prompt).

Para executar scripts, consulte http://ss64.com/ps/syntax-run.html .

SharpC
fonte
3
Como na resposta aceita, isso não retorna nada para o PowerShell 1.0. O método de registro é mais explícito.
Peter Mortensen
4
Se o PowerShell não estiver no caminho, esta versão dará uma falsa impressão de que não está instalado. O método Registry fornece informações completas. Presença e versão.
Xalorous 18/05
9

$host.versioné simplesmente errado / não confiável. Isso fornece a versão do executável de hospedagem (powershell.exe, powergui.exe, powershell_ise.exe, powershellplus.exe etc.) e não a versão do mecanismo em si.

A versão do mecanismo está contida em $psversiontable.psversion. Para o PowerShell 1.0, essa variável não existe; portanto, obviamente, se essa variável não estiver disponível, é totalmente seguro assumir que o mecanismo é 1.0, obviamente.

x0n
fonte
9

Usar:

$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'}
}

Você pode baixar o script detalhado em Como determinar a versão instalada do PowerShell .

Dale Chen
fonte
8

A maneira mais fácil de esquecer esta página e nunca retornar a ela é aprender Get-Variable:

Get-Variable | where {$_.Name -Like '*version*'} | %{$_[0].Value}

Não há necessidade de lembrar todas as variáveis. Apenas Get-Variableé suficiente (e "Deve haver algo sobre a versão").

Roman Pokrovskij
fonte
8
O que é o mesmo que$PSVersionTable
orad
6
Procurando a versão PS? digite $ PSVersion [tab] [enter]. Feito. Não precisa se lembrar de nada :)
ou
1
isso realmente só é útil se você estiver familiarizado com os truques de tubulação usados. De jeito nenhum um iniciante vai ser capaz de se lembrar que tudo o que sintaxe mais fácil do que apenas lembrando $ PSVersionTable
Joseph Gabriel
1
Gente, Get-Variable funciona bem sozinho (se tudo o que você precisa apenas para obter a versão), a tubulação é apenas uma piada :) Também não me lembro da sintaxe da tubulação.
Roman Pokrovskij
7

Para verificar se o PowerShell está instalado, use:

HKLM\Software\Microsoft\PowerShell\1 Install ( = 1 )

Para verificar se o RC2 ou 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

Fonte: este site .

Daniel Elliott
fonte
7

Como a resposta mais útil não abordou a parte se existe , pensei em dar uma olhada nela por meio de uma solução rápida e suja. Ele depende do PowerShell estar na variável de ambiente do caminho , provavelmente o que você deseja. (Dica do chapéu para a resposta superior, pois eu não sabia disso.) Cole isso em um arquivo de texto e nomeie-o

Teste o PowerShell Version.cmd

ou 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
Pecos Bill
fonte
4

Eu precisava verificar a versão do PowerShell e executar o código apropriado. Alguns de nossos servidores executam a v5 e outros a v4. Isso significa que algumas funções, como comprimir, podem ou não estar disponíveis.

Esta é a minha solução:

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"
}
Atron Seige
fonte
3

O cmdlet abaixo retornará a versão do PowerShell.

$PSVersionTable.PSVersion.Major
Venkatakrishnan
fonte
2
$PSVersionTableé uma variável automática; um objeto. Não é um cmdlet.
Maximilian Burszley 26/11
1

Este é o principal resultado da pesquisa para "O arquivo em lote obtém a versão do powershell", portanto, gostaria de fornecer um exemplo básico de como fazer o fluxo condicional em um arquivo em lotes, dependendo da versão do powershell

Exemplo 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.
)

Exemplo do 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
)
Derpy
fonte
0

Você também pode chamar o comando "host" na linha de comando do PowerShell. Deve fornecer o valor da $hostvariável.

Tylor Durden
fonte
3
Isso é semi-errado. hostresolve para Get-Host. Independentemente disso, não é uma maneira confiável de obter a versão.
Maximilian Burszley 26/11
-1

Estendendo a resposta com um operador selecionado:

Get-Host | select {$_.Version}
HaBo
fonte
7
A resposta aceita declara "... $ Host.Version e (Get-Host) .Version não são confiáveis ​​- elas refletem apenas a versão do host, e não o mecanismo" .
Peter Mortensen
Olhares @PeterMortensen como a minha resposta foi antes aceito resposta
HABO
2
@HaBo O que você está vendo? A resposta aceita é a partir de 2009.
TylerH
@TylerH e daí? Não estou seguindo sua pergunta. minha resposta diz claramente que é uma extensão da resposta aceita. é uma versão simplificada.
HaBo 5/03/19
2
@ HaBo Seu comentário anterior parece que você está justificando sua resposta pelo fato de ela ter sido postada antes da resposta aceita, o que não é de todo o caso. Sua resposta foi publicada 7 anos após a resposta aceita e 6 anos após a resposta que a sua realmente 'estende'; por falar nisso, sua resposta não diz claramente que é uma extensão da resposta aceita (que nem usa Get-Host).
TylerH