PowerShell ha sido la columna vertebral de la administración de Windows durante más de una década. Con el lanzamiento de PowerShell 7 (y su evolución continua a través de las versiones 7.x), Microsoft cambió fundamentalmente la dirección de esta herramienta crítica — haciéndola multiplataforma, de código abierto y repleta de características modernas del lenguaje que mejoran dramáticamente la productividad en scripting.

Si todavía estás ejecutando Windows PowerShell 5.1, esta guía te mostrará todo lo nuevo, por qué deberías actualizar y cómo migrar tus scripts existentes con confianza.

PowerShell 5.1 vs PowerShell 7: Comparación lado a lado

Antes de profundizar en los detalles, aquí tienes una comparación de alto nivel de las dos versiones principales de PowerShell:

CaracterísticaWindows PowerShell 5.1PowerShell 7.x
Runtime.NET Framework 4.x.NET 8+ (.NET moderno)
PlataformasSolo WindowsWindows, Linux, macOS
Código abiertoNoSí (Licencia MIT)
Ejecutablepowershell.exepwsh.exe / pwsh
Operador ternarioNo soportadocondicion ? verdadero : falso
Null-CoalescingNo soportado$x ?? 'default'
Pipeline ChainNo soportadocmd1 && cmd2
ForEach -ParallelNo soportadoProcesamiento paralelo integrado
SSH RemotingSolo WinRMSSH y WinRM
Instalación lado a ladoIncluido con WindowsSe instala junto a 5.1
Soporte a largo plazoEn modo mantenimientoEn desarrollo activo

Punto clave: Windows PowerShell 5.1 no va a desaparecer — viene incluido con Windows y continuará recibiendo correcciones de seguridad. Sin embargo, todo el desarrollo de nuevas funcionalidades ocurre exclusivamente en PowerShell 7.x.

¿Por qué actualizar a PowerShell 7?

Administración multiplataforma

PowerShell 7 se ejecuta nativamente en Windows, Linux y macOS. Esto significa que puedes usar los mismos scripts, los mismos módulos y los mismos flujos de trabajo de automatización en toda tu infraestructura — ya sea que estés administrando Windows Server, VMs Ubuntu o máquinas de desarrollo macOS.

Características modernas del lenguaje

PowerShell 7 introduce mejoras de sintaxis que los desarrolladores han estado solicitando durante años: operadores ternarios, null-coalescing, operadores de cadena de pipeline y más. Estas características hacen que los scripts sean más cortos, más legibles y menos propensos a errores.

Mejoras de rendimiento

Construido sobre .NET moderno (8+), PowerShell 7 ofrece un rendimiento significativamente mejor que 5.1 para la mayoría de las cargas de trabajo. La característica ForEach-Object -Parallel por sí sola puede reducir el tiempo de ejecución en órdenes de magnitud para operaciones masivas.

Desarrollo activo y comunidad

Como proyecto de código abierto en GitHub, PowerShell 7 recibe actualizaciones frecuentes, contribuciones de la comunidad y planificación transparente de la hoja de ruta. Los errores se corrigen más rápido y las solicitudes de funcionalidades se toman en serio.

Instalando PowerShell 7

Windows

El método más fácil en Windows es usar winget:

winget install --id Microsoft.PowerShell --source winget

Alternativamente, descarga el instalador MSI de la página de releases de PowerShell en GitHub o usa la Microsoft Store.

Después de la instalación, inicia PowerShell 7 con:

pwsh

Consejo: Tanto powershell.exe (5.1) como pwsh.exe (7.x) pueden coexistir en el mismo sistema. Usan perfiles, directorios de módulos y configuraciones separados.

Linux (Ubuntu/Debian)

# Actualizar el índice de paquetes e instalar los prerequisitos
sudo apt-get update
sudo apt-get install -y wget apt-transport-https software-properties-common

# Importar la clave GPG del repositorio de Microsoft
wget -q "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb"
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

# Instalar PowerShell
sudo apt-get update
sudo apt-get install -y powershell

# Iniciar PowerShell
pwsh

macOS

# Usando Homebrew
brew install powershell/tap/powershell

# Iniciar PowerShell
pwsh

Nuevas características de sintaxis en PowerShell 7

Operador ternario

No más bloques if/else verbosos para asignaciones condicionales simples:

# Forma de PowerShell 5.1
if ($service.Status -eq 'Running') {
    $statusText = 'Healthy'
} else {
    $statusText = 'Down'
}

# Operador ternario de PowerShell 7
$statusText = ($service.Status -eq 'Running') ? 'Healthy' : 'Down'

Operadores Null-Coalescing

El operador ?? proporciona un valor predeterminado cuando el operando izquierdo es $null, y ??= asigna solo si la variable es $null:

# Proporcionar un valor predeterminado si $config es null
$serverName = $config.ServerName ?? 'localhost'

# Asignar solo si $logPath es actualmente null
$logPath ??= 'C:\Logs\default.log'

Operadores de cadena de pipeline (&& y ||)

Ejecución condicional basada en el éxito o fracaso del comando anterior — familiar para cualquier administrador de Linux:

# Solo reiniciar el servicio si la detención fue exitosa
Stop-Service -Name 'MyApp' && Start-Service -Name 'MyApp'

# Ejecutar el respaldo solo si el primer comando falla
Test-Connection -ComputerName 'server01' -Count 1 -Quiet || Write-Warning 'Server unreachable!'

ForEach-Object -Parallel

Esta es posiblemente la característica más impactante para administradores. Procesa elementos del pipeline en paralelo usando runspaces:

# Hacer ping a 100 servidores en paralelo (hasta 10 a la vez)
$servers = Get-Content -Path 'C:\servers.txt'
$servers | ForEach-Object -Parallel {
    $result = Test-Connection -ComputerName $_ -Count 1 -Quiet
    [PSCustomObject]@{
        Server = $_
        Online = $result
    }
} -ThrottleLimit 10

Compara esto con PowerShell 5.1, donde necesitarías usar Start-Job, Invoke-Command o módulos de terceros como PoshRSJob para lograr el mismo resultado. El parámetro -Parallel lo convierte en una sola línea.

Ejemplo del mundo real: Inventario paralelo de servicios

# Recopilar estado de servicios de 50 servidores simultáneamente
$servers = Get-ADComputer -Filter {OperatingSystem -like "*Server*"} |
    Select-Object -ExpandProperty Name

$inventory = $servers | ForEach-Object -Parallel {
    $computerName = $_
    try {
        $services = Invoke-Command -ComputerName $computerName -ScriptBlock {
            Get-Service | Where-Object { $_.StartType -eq 'Automatic' -and $_.Status -ne 'Running' }
        } -ErrorAction Stop
        foreach ($svc in $services) {
            [PSCustomObject]@{
                Computer = $computerName
                Service  = $svc.Name
                Status   = $svc.Status
                StartType = $svc.StartType
            }
        }
    } catch {
        [PSCustomObject]@{
            Computer = $computerName
            Service  = 'CONNECTION_ERROR'
            Status   = $_.Exception.Message
            StartType = 'N/A'
        }
    }
} -ThrottleLimit 20

$inventory | Export-Csv -Path 'C:\Reports\stalled-services.csv' -NoTypeInformation

Mejoras en el manejo de errores

PowerShell 7 introduce patrones más limpios de manejo de errores:

Opciones de vista de errores

# Vista concisa (predeterminada en PS7) -- muestra solo la información esencial del error
$ErrorView = 'ConciseView'

# Para depuración detallada, cambia a la vista normal
$ErrorView = 'NormalView'

# Obtener el registro completo de error con Get-Error
Get-Error

Manejo encadenado de errores con operadores de pipeline

# Intentar la ruta principal, recurrir al respaldo en caso de fallo
Get-Content 'C:\config\primary.json' 2>$null || Get-Content 'C:\config\fallback.json'

-ErrorAction mejorado

El bloque Clean (introducido en PowerShell 7.3+) se ejecuta durante la limpieza independientemente de si ocurrió un error:

function Invoke-DatabaseQuery {
    [CmdletBinding()]
    param([string]$Query)

    begin { $connection = Open-DatabaseConnection }
    process {
        $connection.Execute($Query)
    }
    clean {
        # Siempre se ejecuta -- incluso después de errores terminantes
        if ($connection) { $connection.Close() }
    }
}

SSH Remoting: Más allá de WinRM

Uno de los cambios más significativos para entornos de sistemas operativos mixtos es el soporte nativo de SSH remoting. En lugar de depender de WinRM (que requiere certificados, configuración de hosts de confianza y es solo para Windows), puedes usar SSH:

Configurando SSH Remoting

En la máquina remota (Windows o Linux), configura el subsistema SSH en sshd_config:

# /etc/ssh/sshd_config (Linux) o C:\ProgramData\ssh\sshd_config (Windows)
Subsystem powershell /usr/bin/pwsh -sshs -NoLogo

En Windows, es posible que necesites instalar el servidor OpenSSH primero:

# Instalar el servidor OpenSSH en Windows
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic

Usando SSH Remoting

# Sesión interactiva por SSH
Enter-PSSession -HostName server01.knowledgexchange.xyz -UserName admin

# Ejecutar un comando en un servidor Linux remoto
Invoke-Command -HostName ubuntu-web01 -UserName deploy -ScriptBlock {
    systemctl status nginx
}

# Ejecutar el mismo comando en servidores mixtos Windows y Linux
$linuxServers = @('web01', 'web02', 'db01')
Invoke-Command -HostName $linuxServers -UserName admin -ScriptBlock {
    Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 5
}

Ventaja: SSH remoting funciona a través de firewalls, no requiere configuración adicional de Windows (sin listeners WinRM, sin hosts de confianza) y usa autenticación estándar con claves SSH.

Compatibilidad con scripts existentes

Microsoft incorporó una capa de compatibilidad con Windows en PowerShell 7 que te permite usar muchos módulos de Windows PowerShell 5.1 que aún no han sido portados:

# Importar un módulo de Windows PowerShell usando la capa de compatibilidad
Import-Module ActiveDirectory -UseWindowsPowerShell

# Verificar compatibilidad de módulos
Get-Module -ListAvailable | Where-Object { $_.CompatiblePSEditions -contains 'Desktop' }

Módulos que funcionan nativamente en PowerShell 7

La mayoría de los módulos comunes de administración ya soportan PowerShell 7:

  • ActiveDirectory — funciona mediante la capa de compatibilidad
  • Az (Azure) — soporte nativo
  • Microsoft.Graph — soporte nativo
  • Exchange Online (ExchangeOnlineManagement) — soporte nativo
  • VMware PowerCLI — soporte nativo
  • Pester (framework de pruebas) — soporte nativo
  • PSReadLine — incluido con PowerShell 7

Ejecutar ambas versiones lado a lado

Debido a que PowerShell 7 se instala como pwsh.exe junto a powershell.exe, puedes ejecutar ambas versiones simultáneamente. Cada una tiene sus propias:

  • Rutas de perfil ($PROFILE)
  • Rutas de módulos ($env:PSModulePath)
  • Archivos de configuración
# Verificar qué versión estás ejecutando
$PSVersionTable.PSVersion

# Desde PowerShell 7, iniciar una sesión 5.1
powershell.exe -Command { Get-Module -ListAvailable | Measure-Object }

# Desde PowerShell 5.1, iniciar una sesión 7
pwsh -Command { $PSVersionTable.PSVersion }

Ejemplos prácticos para administradores de Windows

Administrar servidores remotos con SSH

# Definir tu inventario de servidores
$servers = @(
    @{ HostName = 'dc01.corp.local'; UserName = 'admin' },
    @{ HostName = 'web01.corp.local'; UserName = 'admin' },
    @{ HostName = 'linux-db01'; UserName = 'deploy' }
)

# Verificar espacio en disco en todos los servidores
$servers | ForEach-Object -Parallel {
    $server = $_
    Invoke-Command -HostName $server.HostName -UserName $server.UserName -ScriptBlock {
        if ($IsLinux) {
            df -h / | tail -1 | awk '{print $5}'
        } else {
            Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DeviceID='C:'" |
                Select-Object @{N='FreeGB';E={[math]::Round($_.FreeSpace/1GB,2)}}
        }
    }
} -ThrottleLimit 5

Automatizar tareas de Active Directory

# Crear usuarios masivamente desde un archivo CSV con null-coalescing para valores predeterminados
$users = Import-Csv -Path 'C:\HR\new-hires.csv'

foreach ($user in $users) {
    $department = $user.Department ?? 'General'
    $office     = $user.Office ?? 'HQ'
    $title      = $user.Title ?? 'Employee'

    $displayName = "$($user.FirstName) $($user.LastName)"
    $samAccount  = "$($user.FirstName.Substring(0,1))$($user.LastName)".ToLower()

    $params = @{
        Name              = $displayName
        GivenName         = $user.FirstName
        Surname           = $user.LastName
        SamAccountName    = $samAccount
        UserPrincipalName = "$samAccount@corp.local"
        Department        = $department
        Office            = $office
        Title             = $title
        Path              = "OU=$department,DC=corp,DC=local"
        AccountPassword   = (ConvertTo-SecureString 'TempP@ss2026!' -AsPlainText -Force)
        Enabled           = $true
    }

    New-ADUser @params
    Write-Output "Created user: $displayName ($samAccount)"
}

Analizar APIs JSON

# Consultar una API REST y procesar resultados con sintaxis moderna de PowerShell 7
$response = Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases' `
    -Headers @{ 'User-Agent' = 'PowerShell-Admin' }

$latestStable = $response |
    Where-Object { -not $_.prerelease } |
    Select-Object -First 1

$version = $latestStable.tag_name ?? 'Unknown'
$downloadUrl = ($latestStable.assets |
    Where-Object { $_.name -like '*win-x64.msi' })?.browser_download_url ?? 'Not found'

Write-Output "Latest stable: $version"
Write-Output "Download: $downloadUrl"

Nota: El operador ?. (acceso condicional a miembros null) en PowerShell 7 previene errores al acceder a propiedades en objetos potencialmente nulos — extremadamente útil al procesar respuestas de API.

Lista de verificación de migración: De PowerShell 5.1 a 7

Usa esta lista de verificación al migrar tus scripts y flujos de trabajo:

Fase de evaluación

  • Inventariar todos los scripts, tareas programadas y flujos de trabajo de automatización que usan PowerShell 5.1
  • Identificar de qué módulos depende cada script
  • Verificar la compatibilidad de módulos usando Get-Module -ListAvailable en PowerShell 7
  • Probar cada script en PowerShell 7 en un entorno que no sea de producción

Correcciones de compatibilidad

  • Reemplazar el uso de $PSScriptRoot si los scripts dependen de comportamiento específico de 5.1
  • Actualizar cualquier configuración de -OutputEncoding (PowerShell 7 usa UTF-8 por defecto)
  • Revisar cambios en el comportamiento de comparación de cadenas (más consistente en PS7)
  • Reemplazar New-WebServiceProxy con Invoke-RestMethod donde sea aplicable
  • Agregar el flag -UseWindowsPowerShell para módulos que necesitan la capa de compatibilidad

Despliegue

  • Instalar PowerShell 7 en todas las máquinas objetivo (usar Group Policy o SCCM para despliegue empresarial)
  • Actualizar tareas programadas para usar pwsh.exe en lugar de powershell.exe
  • Actualizar pipelines de CI/CD para referenciar pwsh
  • Configurar SSH remoting en servidores que necesitan administración remota
  • Actualizar perfiles de PowerShell ($PROFILE) para el nuevo entorno

Validación

  • Ejecutar pruebas Pester contra los scripts migrados
  • Verificar el comportamiento de logging y manejo de errores
  • Confirmar que la ejecución remota funciona (tanto SSH como WinRM)
  • Monitorear problemas de codificación en archivos de salida

Resumen

PowerShell 7 representa un gran salto adelante para los administradores de Windows. La combinación de soporte multiplataforma, características modernas de sintaxis como operadores ternarios y null-coalescing, procesamiento paralelo de pipeline y SSH remoting lo convierten en una actualización esencial para cualquier persona seria sobre la automatización de infraestructura.

El modelo de instalación lado a lado significa que no hay riesgo en probarlo — tus scripts existentes de PowerShell 5.1 continuarán funcionando exactamente como antes mientras migras gradualmente a PowerShell 7. Comienza instalando pwsh en tu estación de trabajo, prueba tus scripts más críticos y empieza a aprovechar las nuevas características en tu flujo de trabajo diario.

El futuro de PowerShell es multiplataforma, de código abierto y construido sobre .NET moderno. Cuanto antes empieces a usar PowerShell 7, mejor posicionado estarás para administrar la infraestructura cada vez más híbrida que define los entornos de TI modernos.

Recursos adicionales

Para temas relacionados con la administración de Microsoft y Windows Server, consulta nuestros artículos sobre conectarse a Office 365 remoto con PowerShell y administrar Exchange Server.