Migrar de Windows PowerShell 5.1 para PowerShell 7: Guia Prático para Sysadmin de PME

PowerShell 7 · PowerShell 5.1 · Migração · Cross-platform · Windows Server · PME  |  ✎ Duarte Spínola  |  2026-06-27

PowerShell 7 · PowerShell 5.1 · Migração · Cross-platform · Windows Server · PME

O PowerShell 7 é a versão actual e suportada da shell de automação da Microsoft, construída sobre .NET (Core) e executável em Windows, Linux e macOS. Para um sysadmin de PME que ainda usa exclusivamente Windows PowerShell 5.1 — a versão que vem pré-instalada em todos os Windows Server desde 2016 — a migração não é urgente, mas é inevitável: a Microsoft já não adiciona novas funcionalidades ao 5.1, apenas correcções de segurança. O PowerShell 7 recebe actualizações regulares, novos cmdlets e melhorias de desempenho. Este guia percorre as diferenças práticas entre as duas versões, os passos de instalação em Windows e Ubuntu, a verificação de compatibilidade de scripts e módulos, o remoting via SSH, e os erros mais comuns durante a migração. As referências oficiais estão inline, retiradas do guia de migração da Microsoft. Para automação de infraestrutura, consultar também o Windows Server 2025: Novidades e Migração sobre Windows Server 2025.

Neste artigo

  1. O Que Mudou do 5.1 para o 7
  2. PowerShell 7 vs Windows PowerShell 5.1: Comparação
  3. Instalação no Windows Server
  4. Instalação em Ubuntu/Debian
  5. Verificar Compatibilidade de Scripts
  6. Módulos e PSResourceGet
  7. Remoting com SSH em vez de WinRM
  8. Coexistência: Usar Ambos em Paralelo
  9. Migrar Scripts de Automação
  10. Performance e Parallel Foreach
  11. Erros Comuns na Migração
  12. Checklist de Migração

1. O Que Mudou do 5.1 para o 7

O PowerShell 7 (actualmente na versão 7.4 LTS no momento de escrita) foi reescrito sobre .NET Core, o que lhe permite correr em qualquer sistema operativo com .NET instalado. As diferenças principais face ao Windows PowerShell 5.1 são: novo operador ternário ? :, operadores de pipeline && e || (como em bash), ForEach-Object -Parallel, vista de erro melhorada, compatibilidade com módulos .NET Core, e eliminação de funcionalidades legadas como WMI cmdlets (substituídos por CIM). A lista completa de novidades está em What’s New in PowerShell 7.

ℹ️ Nota: O PowerShell 7 instala-se lado-a-lado com o 5.1 — não substitui. O executável do 5.1 é powershell.exe e o do 7 é pwsh.exe. Ambos coexistem sem conflito, o que permite migrar gradualmente.

A introdução oficial ao PowerShell está em PowerShell 101. Para consulta do cmdlet about_using, consultar about_Using. Para gestão remota de servidores Linux, consultar o Samba AD: Controlador de Domínio Open Source sobre diagnóstico Linux.

2. PowerShell 7 vs Windows PowerShell 5.1: Comparação

Característica Windows PowerShell 5.1 PowerShell 7
.NET base .NET Framework 4.x .NET 8 (Core)
Sistemas suportados Apenas Windows Windows, Linux, macOS
Executável powershell.exe pwsh.exe ou pwsh
Ciclo de actualização Apenas segurança (sem novidades) Ativo, 6-12 meses
&& e `\ \ ` em pipeline Não suportado Suportado
ForEach-Object -Parallel Não Sim
Operador ternário ? : Não Sim
WMI cmdlets (Get-WmiObject) Sim (deprecated) Removidos — usar Get-CimInstance
Módulos Windows-only (ex: ActiveDirectory) Total compatível Compatível via Windows PowerShell Compatibility layer
Workflow Suportado (deprecated) Removido

⚠️ Atenção: O PowerShell Workflow foi removido no PowerShell 7. Scripts que usem workflow precisam de ser reescritos com ForEach-Object -Parallel ou com jobs (Start-Job). Em PME, o Workflow era raramente usado, mas verificar antes de migrar.

3. Instalação no Windows Server

A instalação do PowerShell 7 no Windows Server é simples e está documentada em Installing PowerShell on Windows. O método recomendado para servidores é o MSI via linha de comandos:

# Descarregar e instalar PowerShell 7 via MSI (exemplo com 7.4.2)
$url = “https://github.com/PowerShell/PowerShell/releases/download/v7.4.2/PowerShell-7.4.2-win-x64.msi”
$dest = “$env:TEMP\pwsh.msi”
Invoke-WebRequest -Uri $url -OutFile $dest

# Instalação silenciosa com todas as opções
msiexec /i $dest /qn ADD_EXPLORER_CONTEXT_MENU_OPENPOWERSHELL=1 `
ENABLE_PSREMOTING=1 REGISTER_MANIFEST=1 USE_MU=1 ENABLE_MU=1 `
ADD_PATH=1

# Verificar instalação
pwsh -v
# Output esperado: PowerShell 7.4.2

💡 Dica

Para servidores sem acesso à internet (air-gapped), descarregar o MSI numa estação com acesso e transferir via partilha interna. O parâmetro ADD_PATH=1 adiciona pwsh ao PATH, permitindo invocar pwsh de qualquer terminal.

4. Instalação em Ubuntu/Debian

O PowerShell 7 também corre em Linux, o que é útil para PME com servidores Linux (DNS, proxy, monitoring) ou para gestão cross-platform. A instalação em Ubuntu está documentada em Install PowerShell on Ubuntu:

# Ubuntu 24.04 (Noble) — via repositório Microsoft
# Importar a chave GPG
wget -q “https://packages.microsoft.com/config/ubuntu/24.04/packages-microsoft-prod.deb”
sudo dpkg -i packages-microsoft-prod.deb

# atualizar índice e instalar
sudo apt-get update
sudo apt-get install -y powershell

# Verificar
pwsh -v
# Output esperado: PowerShell 7.4.2

# Iniciar sessão interactiva
pwsh

ℹ️ Nota: No Linux, o PowerShell 7 não tem acesso a módulos Windows-only como ActiveDirectory, Hyper-V ou NetAdapter. No entanto, módulos cross-platform como Az (Azure), Microsoft.Graph e PSReadLine funcionam correctamente. Para gestão de servidores Linux com PowerShell, o cmdlet Get-Content, Invoke-WebRequest e operadores de pipeline são equivalentes ao uso em Windows.

5. Verificar Compatibilidade de Scripts

Antes de migrar scripts de 5.1 para 7, é necessário identificar incompatibilidades. As causas mais frequentes são: uso de cmdlets WMI removidos, uso de Workflow, dependência de módulos Windows-only sem compat layer, e uso de APIs .NET Framework não presentes no .NET Core.

# Verificar se um script usa cmdlets WMI (removidos no PS7)
Select-String -Path .\meus_scripts\*.ps1 -Pattern “Get-WmiObject”, “Invoke-WmiMethod”, “Register-WmiEvent”

# Verificar uso de Workflow
Select-String -Path .\meus_scripts\*.ps1 -Pattern “^workflow\s”, “InlineScript”

# Verificar módulos usados pelos scripts
Select-String -Path .\meus_scripts\*.ps1 -Pattern “^Import-Module”, “^using module” |
ForEach-Object { $_.Matches.Groups[1].Value } |
Sort-Object -Unique

⚠️ Atenção: O Get-WmiObject foi removido no PowerShell 7. Substituir por Get-CimInstance, que é equivalente e funciona em ambas as versões. Exemplo: Get-WmiObject -Class Win32_OperatingSystemGet-CimInstance -ClassName Win32_OperatingSystem. Esta substituição deve ser feita em todos os scripts antes de migrar.

6. Módulos e PSResourceGet

O PowerShell 7 introduz o PSResourceGet como substituto do PowerShellGet para gestão de módulos. O PSResourceGet é mais rápido e não depende de NuGet provider.

# Verificar módulos instalados e respectivas versões
Get-Module -ListAvailable |
Where-Object { $_.Version -ge “7.0” } |
Select-Object Name, Version, Path |
Sort-Object Name

# Instalar módulo via PSResourceGet (PowerShell 7.4+)
Install-PSResource -Name Az.Accounts -TrustRepository

# Verificar compatibilidade de um módulo com PS7
Get-Module -ListAvailable ActiveDirectory |
Select-Object Name, Version, CompatiblePSEditions

ℹ️ Nota: O módulo ActiveDirectory funciona no PowerShell 7 através do Windows PowerShell Compatibility layer, que executa o módulo num processo 5.1 em background. Isto adiciona alguma latência na primeira invocação, mas funciona correctamente. Módulos como Hyper-V, NetAdapter e GroupPolicy têm compatibilidade nativa com PS7 nas versões recentes do Windows Server.

7. Remoting com SSH em vez de WinRM

O PowerShell 7 suporta remoting via SSH além do WinRM tradicional. O SSH remoting é mais simples de configurar em ambientes híbridos Windows/Linux e atravessa firewalls mais facilmente. A documentação oficial está em Running Remote Commands.

# Criar sessão SSH para servidor Linux
Enter-PSSession -HostName srvlinux01.empresa.local -UserName admin

# Executar comando remoto via SSH
Invoke-Command -HostName srvwin01.empresa.local -UserName administrator `
-ScriptBlock { Get-Service | Where-Object Status -eq ‘Running’ }

# WinRM tradicional (mantido para compatibilidade)
Enter-PSSession -ComputerName srvwin01.empresa.local -Credential administrator

💡 Dica

Para SSH remoting, o servidor remoto precisa de ter pwsh instalado e OpenSSH configurado com o subsistema PowerShell ativo em sshd_config. No Windows, o OpenSSH é opcional mas recomendado para ambientes híbridos. Para diagnóstico de conectividade entre servidores, consultar o Diagnóstico de Conectividade Windows Server.

8. Coexistência: Usar Ambos em Paralelo

A coexistência é o cenário recomendado para PME: manter o PowerShell 5.1 para scripts legados e usar o 7 para novos scripts e módulos. Ambos partilham o mesmo perfil ($PROFILE), mas os módulos instalados num não são automaticamente visíveis no outro.

# Em PowerShell 7 (pwsh) — verificar perfil
$PROFILE.CurrentUserCurrentHost
# C:\Users\admin\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

# Em Windows PowerShell 5.1 — perfil diferente
# C:\Users\admin\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

# Chamar PowerShell 5.1 a partir do 7 (para módulos não compatíveis)
powershell.exe -Command { Get-WmiObject -Class Win32_BIOS }

# Chamar PowerShell 7 a partir do 5.1
pwsh -Command { Get-Item /etc/os-release }

⚠️ Atenção: Os perfis são diferentes: 5.1 usa WindowsPowerShell e 7 usa PowerShell no caminho. Scripts que dependam de variáveis de perfil definidas num não funcionam no outro. Migrar as configurações de perfil manualmente.

9. Migrar Scripts de Automação

A migração de scripts deve ser feita por fases: primeiro identificar incompatibilidades, depois corrigir WMI para CIM, depois testar em PS7, e finalmente atualizar agendadores (Task Scheduler, cron) para usar pwsh.

# Substituir Get-WmiObject por Get-CimInstance automaticamente
Get-ChildItem -Path .\scripts -Filter *.ps1 | ForEach-Object {
$content = Get-Content $_.FullName -Raw
$new = $content -replace ‘Get-WmiObject’, ‘Get-CimInstance’
$new = $new -replace ‘Invoke-WmiMethod’, ‘Invoke-CimMethod’
$new = $new -replace ‘Register-WmiEvent’, ‘Register-CimIndicationEvent’
Set-Content -Path $_.FullName -Value $new -Encoding UTF8
Write-Host “atualizado: $($_.Name)”
}

# Testar script em PS7
pwsh -File .\scripts\backup_diario.ps1 -WhatIf

ℹ️ Nota: O parâmetro -WhatIf simula a execução sem efectuar alterações. Usar sempre antes de executar scripts migrados pela primeira vez. Para scripts agendados em Task Scheduler, atualizar a action de powershell.exe para pwsh.exe e testar a execução manual.

10. Performance e Parallel Foreach

Uma das vantagens práticas do PowerShell 7 é o ForEach-Object -Parallel, que executa blocos de script em paralelo usando runspaces. Para operações de I/O (consultas API, cópia de ficheiros), a diferença pode ser de 5x a 10x.

# Exemplo: consultar estado de 20 servidores em paralelo
$servers = Get-Content .\lista_servidores.txt

$results = $servers | ForEach-Object -Parallel {
try {
$r = Test-Connection -ComputerName $_ -Count 1 -ErrorAction Stop
[PSCustomObject]@{ Servidor = $_; Estado = “Online”; RTT = $r.ResponseTime }
} catch {
[PSCustomObject]@{ Servidor = $_; Estado = “Offline”; RTT = $null }
}
} -ThrottleLimit 10

$results | Format-Table -AutoSize

Cenário PS 5.1 (sequencial) PS 7 (parallel, 10 threads)
20 servidores Test-Connection ~20 segundos ~3 segundos
50 ficheiros upload S3 ~50 segundos ~8 segundos
10 APIs REST polling ~10 segundos ~2 segundos

⚠️ Atenção: O -Parallel não partilha estado entre threads por defeito. Variáveis externas precisam de $using: para serem acessíveis dentro do bloco paralelo. Exemplo: $using:config referencia uma variável $config definida fora do bloco.

11. Erros Comuns na Migração

Problema Causa Solução
Get-WmiObject não reconhecido Cmdlet removido no PS7 Substituir por Get-CimInstance
Módulo ActiveDirectory não carrega Sem Windows PowerShell Compatibility layer Instalar RSAT e garantir Windows 10/11 ou Server 2019+
workflow erro de parse Workflow removido no PS7 Reescrever com ForEach-Object -Parallel ou Start-Job
Perfil vazio no PS7 Caminho de perfil diferente Copiar perfil de WindowsPowerShell para PowerShell
Invoke-WebRequest sem parse HTML PS7 usa parser diferente (sem IE engine) Instalar módulo AngleParse ou usar -UseBasicParsing (já por defeito)
Script agendado não corre após migração Task Scheduler ainda chama powershell.exe Alterar action para pwsh.exe e verificar caminho
Módulo não encontrado após install Install-Module vs Install-PSResource Em PS7.4+, preferir Install-PSResource; garantir PSGallery trusted

12. Checklist de Migração

  • [ ] Inventariar todos os scripts .ps1 e identificar os que usam WMI ou Workflow
  • [ ] Substituir Get-WmiObject por Get-CimInstance em todos os scripts
  • [ ] Instalar PowerShell 7 em servidores de administração (pwsh -v confirma)
  • [ ] Verificar compatibilidade de módulos críticos (ActiveDirectory, Hyper-V, NetAdapter)
  • [ ] Copiar perfil de WindowsPowerShell para PowerShell e ajustar
  • [ ] Testar scripts migrados com -WhatIf antes de execução real
  • [ ] atualizar Task Scheduler: powershell.exepwsh.exe
  • [ ] Configurar SSH remoting em servidores híbridos Windows/Linux
  • [ ] Migrar gestão de módulos para Install-PSResource (PS7.4+)
  • [ ] Avaliar ForEach-Object -Parallel para scripts de I/O intensivo
  • [ ] Documentar a versão de PowerShell usada em cada script (cabeçalho #requires -Version 7)
  • [ ] Manter PowerShell 5.1 disponível para scripts legados não migrados
  • [ ] Consultar ciclo de suporte em PowerShell Support Lifecycle. O repositório oficial do PowerShell 7 está em GitHub PowerShell/PowerShell. Para automação de infraestrutura com Git, consultar o Ransomware: Backup 3-2-1 Imutável. Para gestão de contentores com PowerShell, consultar o BitLocker + Entra ID Join.

Artigos Relacionados

← Voltar ao Índice

Este artigo foi útil?

Duarte Spínola

Deixe um Comentário