Pide tu presupuesto ya!

Migración de PowerShell 6 a 7.5: cambios importantes/nuevas funciones

Adoptaste PowerShell Core 6 temprano. Movió scripts a .NET Core. Te ocupaste de los problemas de compatibilidad. Ahora Microsoft quiere que actualices nuevamente.

He aquí por qué es importante: PowerShell Core 6 ya no es compatible. Sus scripts aún se ejecutan, pero le faltan parches de seguridad, mejoras de rendimiento y características que hacen que valga la pena actualizar PowerShell 7.5.

¿La buena noticia? Pasar de Core 6 a 7.5 es más fácil que saltar de Windows PowerShell. La mayoría de los scripts funcionan sin cambios. Pero “la mayoría” no es “todos” y las diferencias importan.

Por qué PowerShell 7 reemplazó a Core 6

PowerShell Core 6 fue el experimento. Demostró que PowerShell podía ejecutarse en varias plataformas, pero rompía demasiadas cosas. Las empresas se quejaron. Los guiones fallaron. Microsoft escuchó.

PowerShell 7 solucionó los problemas:

  • Compatibilidad restaurada con más módulos de Windows PowerShell
  • Rendimiento mejorado del tiempo de ejecución de .NET
  • Se agregaron cmdlets faltantes
  • Unificado el control de versiones de PowerShell (no más “Core” en el nombre)

PowerShell 7.5 (estable, no LTS) se basa en .NET 9 y se admite hasta el 12 de mayo de 2026. PowerShell 7.4 (LTS) se ejecuta en .NET 8 y se admite hasta el 10 de noviembre de 2026. Consulte la Ciclo de vida de soporte de PowerShell para detalles completos.

Cambios importantes desde Core 6

Estos cambios afectarán sus scripts:

Coherencia de codificación

Desde PowerShell 6, la codificación de texto predeterminada es UTF-8 sin lista de materiales para la mayoría de los cmdlets de texto. Esto no ha cambiado en 7.5, pero especifique -Encoding explícitamente cuando la interoperabilidad lo requiera:

# Both Core 6 and 7.5 default to UTF-8 without BOM
Get-Content file.txt | Out-File output.txt

# Specify encoding when working with legacy systems
Get-Content file.txt | Out-File output.txt -Encoding UTF8BOM

Para obtener detalles completos sobre la codificación, consulte about_Character_Encoding.

Cambios en la vista de errores

Presentación de PowerShell 7 ConciseView como el visualización de error predeterminada y el nuevo Get-Error cmdlet:

# PowerShell 7.5 - Cleaner error display by default
$ErrorView = 'ConciseView'  # This is the default

# Use Get-Error for detailed error information
Get-Error -Newest 5

Obtenga más información sobre el manejo de errores en about_Preference_Variables.

Cmdlet de conexión de prueba reescrito

El Test-Connection Los nombres de los parámetros del cmdlet cambiaron por completo. El -ComputerName El parámetro de PowerShell 5.1 se convirtió en -TargetName en Núcleo 6+:

# Core 6 and 7.5 - Use -TargetName
Test-Connection -TargetName server01 -Count 2

# PowerShell 7.5 - Additional parameters available
Test-Connection -TargetName server01 -Count 2 -IPv4

Ver Documentación de prueba de conexión para todos los parámetros.

Comportamiento del proxy de cmdlets web

En PowerShell 7.0+, los cmdlets web admiten la configuración de proxy a través de variables de entorno y explícitas. -Proxy parámetro:

# PowerShell 7.5 - Honors proxy environment variables
$env:HTTP_PROXY = 'http://proxy:8080'
Invoke-WebRequest -Uri 'https://api.example.com'

# Or use explicit proxy
Invoke-WebRequest -Uri 'https://api.example.com' -Proxy 'http://proxy:8080'

Detalles en Documentación de Invoke-WebRequest.

Victoria rápida: operadores de cadena Reemplazar detallado if ($?) bloques con && y || que los operadores fallen rápidamente en los procesos de CI/CD. Ejemplo: Build-Project && Deploy-Project

Mejoras de rendimiento

PowerShell 7.x generalmente se inicia y ejecuta más rápido que Core 6 debido a mejoras en el tiempo de ejecución de .NET. En lugar de confiar en porcentajes genéricos, compare sus scripts con Measure-Command en su hardware:

# Measure startup time
Measure-Command { pwsh -Command "exit" }

# Compare ForEach-Object performance
$data = 1..100000
Measure-Command {
    $data | ForEach-Object { $_ * 2 }
}

# Test parallel performance (new in PowerShell 7)
Measure-Command {
    $data | ForEach-Object -Parallel { $_ * 2 } -ThrottleLimit 5
}

Nuevas funciones desde Core 6

PowerShell 7.5 agrega funciones que no estaban en Core 6. Consulte Novedades de PowerShell 7.5 para ver la lista completa.

Procesamiento paralelo

ForEach-Object -Parallel era introducido en PowerShell 7.0 y no existía en Core 6:

# Core 6 - Sequential processing only
$servers = Get-Content servers.txt
$servers | ForEach-Object {
    Test-Connection -TargetName $_ -Count 1
}

# PowerShell 7.5 - Parallel execution
$servers | ForEach-Object -Parallel {
    Test-Connection -TargetName $_ -Count 1
} -ThrottleLimit 10

Operadores de cadenas de oleoductos

Operadores de cadena de oleoductos (&& y ||) le permiten fallar rápidamente en tuberías sin detalles if ($?) bloques:

# Core 6 - Manual error checking
$result = Start-Service 'Spooler'
if ($?) {
    Write-Output "Service started"
}

# PowerShell 7.5 - Chain operators
Start-Service 'Spooler' && Write-Output "Service started"

Más información: about_Pipeline_Chain_Operadores

Operadores coalescentes nulos

Operadores coalescentes nulos (?? y ??=) reducir el código de verificación nula:

# Core 6 - Verbose null checking
if ($null -eq $config) {
    $config = Get-DefaultConfig
}

# PowerShell 7.5 - Null coalescing assignment
$config ??= Get-DefaultConfig

Detalles: about_Assignment_Operadores

Devoluciones fuera de GridView

Out-GridView está disponible nuevamente en Windows en PowerShell 7+. Para escenarios multiplataforma, utilice Out-ConsoleGridView desde ConsoleGuiTools módulo:

# PowerShell 7.5 on Windows
Get-Process | Out-GridView -Title "Select Process" -PassThru

# Cross-platform alternative
Install-Module ConsoleGuiTools -Scope CurrentUser
Get-Process | Out-ConsoleGridView

Ver Documentación fuera de GridView.

Actualizaciones de compatibilidad de módulos

PowerShell 7.5 admite más módulos que Core 6:

Soporte nativo agregado

Estos módulos ahora funcionan con PowerShell 7 (los requisitos de versión varían):

Importar cambios

La importación de módulos proporciona mejores mensajes de error:

# PowerShell 7.5 - Use compatibility mode for Windows-only modules
Import-Module SomeWindowsModule -UseWindowsPowerShell

Entendido: valores predeterminados de profundidad JSON ConvertTo-Json El valor predeterminado es Profundidad = 2 (¡no 100!). Siempre configurado -Depth explícitamente para evitar el truncamiento de datos: $object | ConvertTo-Json -Depth 5

Instalación y comportamiento en paralelo

Notas críticas de instalación para Windows

En Windows, instalando PowerShell 7:

  • Elimina PowerShell Core 6.x y reemplaza su entrada PATH
  • Corre lado a lado con Windows PowerShell 5.1
  • Actualiza cualquier instalación existente de PowerShell 7.x

Ver Instalación de PowerShell en Windows para más detalles.

Pasos de instalación

# Windows - Using winget
winget install --id Microsoft.PowerShell --exact

# Linux - Using package manager
sudo apt-get update
sudo apt-get install -y powershell

# macOS - Using Homebrew
brew install --cask powershell

Verificar la instalación

$PSVersionTable.PSVersion

Problemas comunes de actualización

Profundidad del cmdlet JSON

ConvertTo-Json por defecto es Profundidad=2 (avisa cuando se excede). ConvertFrom-Json por defecto es Profundidad=1024:

# ConvertTo-Json defaults to depth 2 - set it explicitly
$object | ConvertTo-Json -Depth 5   # Prevents truncation

# ConvertFrom-Json handles deeply nested JSON (depth 1024)
$json | ConvertFrom-Json

Referencia: Documentación de ConvertTo-Json

Funciones experimentales

Las características experimentales de Core 6 cambiaron en 7.5:

# List current experimental features
Get-ExperimentalFeature

# Enable specific features
Enable-ExperimentalFeature -Name PSCommandNotFoundSuggestion

Actualizaciones de la ruta del módulo

Verifique y actualice las rutas de los módulos:

# View PowerShell 7.5 module paths
$env:PSModulePath -split [IO.Path]::PathSeparator

Probando su migración

Cree un enfoque de prueba estructurado:

Análisis de sintaxis

Install-Module -Name PSScriptAnalyzer -Force
Invoke-ScriptAnalyzer -Path "C:\Scripts" -Recurse

Compatibilidad del módulo

$modules="Az", 'VMware.PowerCLI', 'ExchangeOnlineManagement'
$modules | ForEach-Object {
    try {
        Import-Module $_ -ErrorAction Stop
        Write-Output "$_ loaded successfully"
    } catch {
        Write-Warning "$_ failed: $_"
    }
}

Comparación de rendimiento

# Benchmark in both versions
Measure-Command { & "C:\Scripts\critical-script.ps1" }

Tomar la decisión

La actualización de Core 6 a PowerShell 7.5 es sencilla para la mayoría de los scripts. Comience con los entornos de desarrollo. Pruebe guiones críticos. Documente los cambios requeridos.

Recordar:

  • PowerShell Core 6 ya no es compatible.
  • PowerShell 7.4 LTS será compatible hasta el 10 de noviembre de 2026.
  • PowerShell 7.5 (no LTS) es compatible hasta el 12 de mayo de 2026.

Próximos pasos

  1. Revisa el Ciclo de vida de soporte de PowerShell
  2. Descargar desde el guía de instalación oficial
  3. Prueba con PSScriptAnalyzer
  4. Controlar Novedades de PowerShell 7.5
  5. Revisar documentacion migratoria

Su inversión en Core 6 no fue en vano. Demostró que PowerShell podía ser multiplataforma. Ahora, PowerShell 7.5 cumple esa promesa con mejor rendimiento, compatibilidad y soporte.

Written by

Leave a comment