Verificar Versões do PowerShell: Melhores Práticas

No PowerShell, existem mil 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 cobrir as formas ruins e a minha forma recomendada.

Existem sites que mostram várias maneiras de verificar sua versão do 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 1.0 até o PowerShell 7.

As maneiras de descobrir a versão do PowerShell que você está usando 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 o motor do PowerShell. Não é o próprio motor 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 do 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, nem sempre é 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 fará isso 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

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

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

Verifique a versão do PowerShell com 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 sobre este método. É simplesmente o mesmo que executar Get-Host.

$host.Version em Computadores Remotos

Você verá o mesmo comportamento via Remoção do PowerShell com $host.Version como você verá 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

Perigo, 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á escondida sob um valor no caminho da chave do registro HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine. Esta chave do registro tem um valor chamado PowerShellVersion que você pode referenciar 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 é similar, 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 de forma alguma para encontrar a versão. Você pode executar comandos do prompt de comando ou 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 local 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 localmente e remotamente é bom. Mas eu tenho uma maneira melhor de mostrar usando a variável automática $PSVersionTable.

Verifique a Versão do Powershell via o 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 motor do PowerShell.

PS51> $PSVersionTable.PSVersion

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

A variável automática $PSVersionTable é uma tabela de hash somente leitura que retorna informações especificamente sobre a versão do motor 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 mais informações sobre a edição do PowerShell em execução.

$PSVersionTable output

$PSVersionTable em Computadores Remotos

Usar a variável automática $PSVersionTable é preciso tanto localmente quanto remotamente. Você pode ver abaixo que, ao envolver $PSVersionTable.PSVersion em um bloco de script e executar 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 usar para 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 dar crédito a você.

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