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
- O Que Mudou do 5.1 para o 7
- PowerShell 7 vs Windows PowerShell 5.1: Comparação
- Instalação no Windows Server
- Instalação em Ubuntu/Debian
- Verificar Compatibilidade de Scripts
- Módulos e PSResourceGet
- Remoting com SSH em vez de WinRM
- Coexistência: Usar Ambos em Paralelo
- Migrar Scripts de Automação
- Performance e Parallel Foreach
- Erros Comuns na Migração
- 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:
$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:
# 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.
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_OperatingSystem → Get-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.
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.
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.
$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.
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.
$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
.ps1e identificar os que usam WMI ou Workflow - [ ] Substituir
Get-WmiObjectporGet-CimInstanceem todos os scripts - [ ] Instalar PowerShell 7 em servidores de administração (
pwsh -vconfirma) - [ ] Verificar compatibilidade de módulos críticos (ActiveDirectory, Hyper-V, NetAdapter)
- [ ] Copiar perfil de
WindowsPowerShellparaPowerShelle ajustar - [ ] Testar scripts migrados com
-WhatIfantes de execução real - [ ] atualizar Task Scheduler:
powershell.exe→pwsh.exe - [ ] Configurar SSH remoting em servidores híbridos Windows/Linux
- [ ] Migrar gestão de módulos para
Install-PSResource(PS7.4+) - [ ] Avaliar
ForEach-Object -Parallelpara 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.
