Verificar Versões do PowerShell: Melhores Práticas

No PowerShell, existem zilhões de maneiras de fazer a mesma coisa (ou algo semelhante). Neste post do blog, você aprenderá todas as maneiras de verificar a versão do PowerShell que você tem em computadores locais e remotos. Vamos abordar as maneiras ruins e a minha maneira recomendada.

Existem sites que mostram várias maneiras de verificar a versão do seu Powershell. Mas nenhum compilou uma lista abrangente de todas elas. Decidi mudar isso.

Todas essas maneiras devem funcionar tanto no Windows PowerShell quanto no PowerShell Core. Esses métodos também devem funcionar nas versões do Windows PowerShell de 1.0 até o PowerShell 7.

As maneiras de descobrir a versão do PowerShell que você está executando são:

  1. A propriedade (Get-Host).Version
  2. A propriedade $host.Version
  3. O registro (apenas no Windows PowerShell)
  4. A propriedade $PSVersionTable.PSVersion

Vamos detalhar todas as maneiras de encontrar a versão do PowerShell da menos recomendada para a mais recomendada.

Get-Host

O PowerShell tem um conceito conhecido como hosts. Um host é um programa que está hospedando a engine do PowerShell. Não é a própria engine do PowerShell. O console do PowerShell ou um editor de código com um terminal integrado são hosts do PowerShell.

A host can have a version that is completely independent of PowerShell itself. This can be deceiving to many newcomers. Let me show you why.

Se você executar (Get-Host).Version, verá que ele retorna um número de versão que parece ser a versão do motor PowerShell. As aparências podem ser enganosas.

Abaixo, executei Get-Host no Windows PowerShell 5.1 e você pode ver que retorna 5.1.17134.858. Isso parece ser uma versão legítima.

PS51> (Get-Host).Version
Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  858

No entanto, às vezes, ao executar Get-Host em um terminal integrado, a versão não é a mesma. Embora geralmente o host represente a mesma versão do motor, não necessariamente sempre acontece assim.

Verifique a versão do PowerShell via Get-Host em computadores remotos

Mesmo que Get-Host pareça retornar a mesma versão ao ser executado em um computador local, nunca será o mesmo em computadores remotos.

Por exemplo, vamos executar Get-Host em um servidor remoto do Windows Server 2016 via Invoke-Command e ver o que acontece.

PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {Get-Host} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
1      0      0      0        10.0.0.5

Na última vez que verifiquei, não era possível executar o PowerShell v1 no Windows Server 2016.

Depender de Get-Host é apenas uma má ideia em todos os aspectos.

Verifique a versão do PowerShell usando o comando $host.Version

Fazer referência a $host.Version é outra maneira de verificar a versão do PowerShell. A variável $host é uma variável automática que retorna a mesma saída que Get-Host.

Referencing $host.Version

Não há nada de especial neste método. É simplesmente o mesmo que executar Get-Host.

$host.Version em Computadores Remotos

Você verá o mesmo comportamento via PowerShell Remoting com $host.Version como veria executando Get-Host.

PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {$host.Version} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
1      0      0      0        10.0.0.5

Cuidado, Will Robinson!

Registro

Se você não quiser abrir o próprio PowerShell, também pode verificar o registro. A versão do PowerShell está armazenada em um valor no caminho do registro HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine. Esta chave do registro tem um valor chamado PowerShellVersion que você pode consultar usando Get-ItemProperty.

PS51> (Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion
5.1.17134.1

Você pode ver que esta versão é semelhante, mas não inclui a revisão como as outras opções fazem.

PS51> [version](Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  1

Usando Outras Ferramentas

O uso do registro também significa que você não precisa usar o PowerShell para encontrar a versão. Você pode executar comandos a partir do prompt de comando ou de outra ferramenta que possa ler o registro.

CMD> reg query HKLM\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine /v PowerShellVersion

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

Registro em Computadores Remotos

O registro é estático e os valores não mudarão localmente ou remotamente. Você pode ter confiança de que o que você vê localmente será o mesmo que você vê remotamente.

PS51> $scriptBlock = {
    [version](Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion
}
PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock $scriptBlock -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
5      1      17763  1        10.0.0.5

Mostrar a mesma versão local e remotamente é bom. Mas tenho uma maneira melhor de mostrar usando a variável automática $PSVersionTable.

Verificar a versão do PowerShell via comando $PSVersionTable.PSVersion

O último e método final é fazer referência à propriedade PSVersion na variável automática $PSVersionTable. Este método sempre representará o mecanismo do PowerShell.

PS51> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  858

A variável automática $PSVersionTable é uma tabela hash somente leitura que retorna informações especificamente sobre a versão do mecanismo do PowerShell. Esta variável automática não apenas retorna a versão, mas também a PSEdition. Esta propriedade pode ser Core ou Desktop para fornecer informações adicionais sobre a edição do PowerShell que está em execução.

$PSVersionTable output

$PSVersionTable em Computadores Remotos

O uso da variável automática $PSVersionTable é preciso tanto localmente quanto remotamente. Você pode ver abaixo que envolvendo $PSVersionTable.PSVersion em um scriptblock e executando esse código em um computador remoto, ele retornará a mesma versão.

PS> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {$PSVersionTable.PSVersion} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
5      1      17763  592      10.0.0.5

Resumo

Neste post do blog, você aprendeu todas as maneiras de verificar a versão do PowerShell tanto localmente quanto remotamente. Espero que os primeiros métodos tenham lhe dado uma ideia de quais maneiras não verificar a versão!

I recommend always using $PSVersionTable.PSVersion. All of the other methods may appear similar to the PowerShell engine version but may not always reflect the engine version.

Se eu perdi alguma maneira, por favor me avise nos comentários. Ficarei feliz em atualizar o post e lhe dar crédito.

Source:
https://adamtheautomator.com/powershell-version/