Respostas:
Use $PSVersionTable.PSVersion
para 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.Version
e (Get-Host).Version
nã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
$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 $host
apenas mostrará a versão mais baixa que eles concordaram em serializar. Enquanto $PSVersionTable
mostrará a versão verdadeira. Espero que ele iria ajudar alguém ..
notepad $profile
e joguei function psver { $PSVersionTable; $PSVersionTable.PSVersion }
nele. Recarregando . $profile
e posso digitar a psver
qualquer momento para obter informações detalhadas da versão e outros detalhes.
Eu usaria Get-Host ou $ PSVersionTable . Como Andy Schneider aponta, $PSVersionTable
nã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
$host.version
nã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.)
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
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"}
}
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.
cmd
e powershell
sem sucesso. Eu teria esperado o mesmo comportamento também. :)
pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
funciona bem.
Você pode verificar se a versão do Windows PowerShell foi instalada executando a seguinte verificação:
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/
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:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
Para verificar se a versão 1.0 ou 2.0 do PowerShell está instalada, verifique o seguinte valor no registro:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
Encontrei a maneira mais fácil de verificar se o instalado era:
cmd
e OK)powershell
e pressione return. Você deve receber o PS
prompt 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 exit
se você deseja voltar ao prompt de comando ( exit
novamente se também deseja fechar o prompt).
Para executar scripts, consulte http://ss64.com/ps/syntax-run.html .
$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.
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 .
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").
$PSVersionTable
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 .
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
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"
}
O cmdlet abaixo retornará a versão do PowerShell.
$PSVersionTable.PSVersion.Major
$PSVersionTable
é uma variável automática; um objeto. Não é um cmdlet.
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
)
Você também pode chamar o comando "host" na linha de comando do PowerShell. Deve fornecer o valor da $host
variável.
host
resolve para Get-Host
. Independentemente disso, não é uma maneira confiável de obter a versão.
Estendendo a resposta com um operador selecionado:
Get-Host | select {$_.Version}
Get-Host
).