Compartir a través de


Novedades de PowerShell 7.5

PowerShell 7.5-rc.1 incluye las siguientes características, actualizaciones y cambios importantes. PowerShell 7.5 se basa en la versión de disponibilidad general de .NET 9.0.100.

Para ver la lista completa de cambios, consulte el REGISTRO DE CAMBIOS en el repositorio de GitHub.

Últimos cambios

  • Corrección de los parámetros -OlderThan y -NewerThan para Test-Path al usar PathType y el intervalo de fechas (#20942) (¡Gracias a @ArmaanMcleod!)
    • Anteriormente, -OlderThan se omitía si se especificaban juntos
  • Cambio del valor predeterminado de New-FileCatalog -CatalogVersion a 2 (#20428) (¡Gracias a @ThomasNieto!)
  • Bloqueo de la obtención de ayuda desde ubicaciones de red en sesiones de comunicación remota restringidas (#20593)
  • El instalador de Windows ahora recuerda las opciones de instalación que se usan y las usa para inicializar las opciones de la siguiente instalación (#20420) (¡gracias, @reduckted!)
  • ConvertTo-Json ahora serializa BigInteger como un número (#21000) (¡gracias, @jborean93!)

Módulos actualizados

PowerShell 7.5-rc.1 incluye los siguientes módulos actualizados:

  • Microsoft.PowerShell.PSResourceGet v1.1.0-RC2
  • PSReadLine v2.3.6

Mejoras de finalización con tabulación

Muchas gracias a @ArmaanMcleod y a los demás colaboradores por todo el trabajo realizado para mejorar la finalización con tabulación.

  • Revertir a la inferencia de tipos cuando no se puede recuperar el par clave-valor hashtable de la expresión segura (#21184) (¡gracias, @MartinGC94!)
  • Se ha corregido la regresión al realizar la inferencia de tipos para $_ (#21223) (¡gracias, @MartinGC94!)
  • Expanda ~ a $home en Windows con finalización de pestañas (#21529)
  • No se completa al declarar el nombre de parámetro y el miembro de clase (#21182) (¡gracias, @MartinGC94!)
  • Evitar la reserva a la finalización de archivos al completar la finalización con tabulación de nombres de tipo (#20084) (Gracias a @MartinGC94)
  • Agregar el finalizador de argumentos a -Version para Set-StrictMode (#20554) (¡Gracias a @ArmaanMcleod!)
  • Agregar el finalizador de argumentos -Verb para Get-Verb/ Get-Command y refactorizar Get-Verb (#20286) (Gracias @ArmaanMcleod)
  • Agregar el finalizador de argumentos -Verb para Start-Process (#20415) (Gracias a @ArmaanMcleod)
  • Agregar el finalizador de argumentos -Scope para los comandos *-Variable, *-Alias y *-PSDrive (#20451) (Gracias a @ArmaanMcleod)
  • Agregar la finalización -Module para los comandos Save-Help/Update-Help (#20678) (Gracias a @ArmaanMcleod)

Nuevos cmdlets

  • Agregar cmdlets ConvertTo-CliXml y ConvertFrom-CliXml (#21063) (gracias @ArmaanMcleod!)

Mejoras en los cmdlets web

  • Corrección para permitir que -PassThru y -Outfile funcionen conjuntamente (#24086)
  • Agregue la propiedad OutFile en WebResponseObject (#24047)
  • Mostrar nombre de archivo en Invoke-WebRequest -OutFile -Verbose (#24041)
  • Corrección de webCmdlets cuando -Body se especifica, pero ContentType no es (#23952) (gracias @CarloToso!)
  • Corrección de Invoke-WebRequest para notificar el tamaño correcto cuando se especifica -Resume (#20207) (Gracias a @LNKLEO!)
  • Corrección de los cmdlets web para permitir que las aplicaciones WinForm funcionen correctamente (#20606)

Otras mejoras de cmdlets

  • Habilitar -NoRestart para trabajar con Register-PSSessionConfiguration (#23891)
  • Agregar las opciones IgnoreComments y AllowTrailingCommas al cmdlet Test-Json (#23817) (gracias @ArmaanMcleod!)
  • Get-Help puede notificar parámetros con el atributo ValueFromRemainingArguments como canalizable (#23871)
  • Cambiar el tipo de LineNumber a ulong en Select-String (#24075) (gracias @Snowman-25!)
  • Get-Process: Se ha quitado el requisito de administrador de -IncludeUserName (21302) (¡gracias, @jborean93!)
  • Se ha corregido Test-Path -IsValid para comprobar si hay caracteres de nombre de archivo y ruta de acceso no válidos (#21358)
  • Agregar RecommendedAction a la vista ConciseView del informe de errores (#20826) (¡gracias, @JustinGrote!)
  • Se ha agregado la barra de progreso para el cmdlet Remove-Item (#20778) (¡gracias, @ArmaanMcleod!)
  • Corrección de Test-Connection debido a cambios en .NET 8 (#20369)
  • Corrección del Get-Service mensaje de error que no terminaba para que incluya la categoría (#20276)
  • Agregar los parámetros -Empty y -InputObject a New-Guid (#20014) (¡Gracias a @CarloToso!)
  • Agregar el alias r al parámetro -Recurse para el comando Get-ChildItem (#20100) (¡Gracias a @kilasuit!)
  • Agregar los alias LP a LiteralPath para las funciones que aún faltan (#20820)
  • Agregar la reserva de localización implícita a Import-LocalizedData (#19896) (¡Gracias a @chrisdent-de!)
  • Agregar Aliases a las propiedades que se muestran al dar formato al contenido de ayuda del parámetro devuelto por Get-Help (#20994)
  • Agregar HelpUri a Remove-Service (#20476)
  • Corrección del bloqueo de finalización para el proveedor SCCM (#20815, #20919, #20915) (¡Gracias a @MartinGC94!)
  • Corrección de la regresión en Get-Content cuando se usan -Tail 0 y -Wait juntos (#20734) (¡Gracias a @CarloToso!)
  • Corrección de Start-Process -PassThru para asegurarse de que la propiedad ExitCode sea accesible para el objeto Process devuelto (#20749) (¡Gracias a @CodeCyclone!)
  • Corrección de Group-Object para usar la referencia cultural actual para la salida (#20608)
  • Corrección de la salida de Group-Object mediante cadenas interpoladas (#20745) (¡Gracias a @mawosoft!)
  • Corrección de la representación de DisplayRoot para la red de PSDrive (#20793)
  • Corrección del progreso de Copy-Item para que se muestre completado solo cuando se hayan copiado todos los archivos (#20517)
  • Corrección de la regresión de finalización de la ruta de acceso UNC (#20419) (¡Gracias a @MartinGC94!)
  • Informe del error si se pasa una -ExecutionPolicy no válida a pwsh (#20460)
  • Agregar módulos WinGetCommandNotFound y CompletionPredictor para realizar un seguimiento del uso (21040)
  • Agregar el parámetro DateKind a ConvertFrom-Json (20925) (gracias @jborean93!)
  • Agregar DirectoryInfo al elemento OutputType para New-Item (#21126) (gracias @MartinGC94!)
  • Corregir la serialización Get-Error de valores de matriz (#21085) (gracias @jborean93!)
  • Corregir Test-ModuleManifest para que pueda usar una ruta de acceso UNC (#24115)
  • Corregir Get-TypeData para escribir en la canalización inmediatamente en lugar de recopilar datos primero (#24236) (gracias @MartinGC94)
  • Agregar el parámetro -Force a los cmdlets Resolve-Path y Convert-Path para admitir archivos ocultos comodín #20981 (gracias @ArmaanMcleod!)

Mejoras del motor

  • Iniciar y detener explícitamente el color de error ANSI (#24065) (gracias @JustinGrote!)
  • Mejorar la definición de sobrecarga de .NET de métodos genéricos (#21326) (gracias @jborean93!)
  • Optimizar la operación += de una colección cuando se trata de una matriz de objetos (#23901) (gracias @jborean93!)
  • Agregar telemetría para comprobar etiquetas específicas al importar un módulo (#20371)
  • Agregar PSAdapter y ConsoleGuiTools a la lista de permitidos de telemetría de carga del módulo (#20641)
  • Agregar el módulo Winget para realizar un seguimiento del uso (#21040)
  • Asegurarse de que el nombre de archivo no es nulo al registrar eventos ETW de WDAC (#20910) (¡Gracias a @jborean93!)
  • Corrección de cuatro regresiones introducidas por la característica de registro de WDAC (#20913)
  • Dejar los identificadores de entrada, salida y error sin establecer cuando no se redirijan (#20853)
  • Corrección de cmdlets de proxy de comunicación remota implícita para que actúen en parámetros comunes (#20367)
  • Incluir la versión del módulo en los mensajes de error cuando no se encuentre el módulo (#20144) (¡Gracias a @ArmaanMcleod!)
  • Corrección de unixmode para controlar setuid y sticky cuando el archivo no es un ejecutable (#20366)
  • Se ha corregido el uso del ensamblado para usar Path.Combine al construir rutas de acceso de ensamblado (21169)
  • Validar el valor para usar el espacio de nombres durante las comprobaciones semánticas para evitar declarar espacios de nombres no válidos (21162)
  • Controlar la herramienta global especialmente cuando se añade $PSHome a PATH (#24228)

Características experimentales

Las siguientes características experimentales se convirtieron en características estándar en PowerShell 7.5-rc.1:

Las siguientes características experimentales se incluyen en PowerShell 7.5-rc.1:

Mejoras de rendimiento

PowerShell 7.5-rc.1 incluyó PR#23901 de @jborean93 que mejora el rendimiento de la operación de += para una matriz de objetos.

En el ejemplo siguiente se mide el rendimiento de los distintos métodos de agregar elementos a una matriz.

$tests = @{
    'Direct Assignment' = {
        param($count)

    $result = foreach($i in 1..$count) {
            $i
        }
    }
    'List<T>.Add(T)' = {
        param($count)

        $result = [Collections.Generic.List[int]]::new()
        foreach($i in 1..$count) {
            $result.Add($i)
        }
    }
    'Array+= Operator' = {
        param($count)

        $result = @()
        foreach($i in 1..$count) {
            $result += $i
        }
    }
}

5kb, 10kb | ForEach-Object {
    $groupResult = foreach($test in $tests.GetEnumerator()) {
        $ms = (Measure-Command { & $test.Value -Count $_ }).TotalMilliseconds

[pscustomobject]@{
            CollectionSize    = $_
            Test              = $test.Key
            TotalMilliseconds = [math]::Round($ms, 2)
        }

[GC]::Collect()
        [GC]::WaitForPendingFinalizers()
    }

$groupResult = $groupResult | Sort-Object TotalMilliseconds
    $groupResult | Select-Object *, @{
        Name       = 'RelativeSpeed'
        Expression = {
            $relativeSpeed = $_.TotalMilliseconds / $groupResult[0].TotalMilliseconds
            $speed = [math]::Round($relativeSpeed, 2).ToString() + 'x'
            if ($speed -eq '1x') { $speed } else { $speed + ' slower' }
        }
    } | Format-Table -AutoSize
}

Al ejecutar el script en PowerShell 7.4.6, verá que el uso del operador += es el método más lento.

CollectionSize Test                TotalMilliseconds RelativeSpeed
-------------- ----                ----------------- -------------
          5120 Direct Assignment                4.17 1x
          5120 List<T>.Add(T)                  90.79 21.77x slower
          5120 Array+= Operator               342.58 82.15x slower


CollectionSize Test                TotalMilliseconds RelativeSpeed
-------------- ----                ----------------- -------------
         10240 Direct Assignment                0.64 1x
         10240 List<T>.Add(T)                 184.10 287.66x slower
         10240 Array+= Operator              1668.13 2606.45x slower

Al ejecutar el script en PowerShell 7.5-rc.1, verá que el uso del operador += es mucho más rápido que PowerShell 7.4.6. Ahora, también es más rápido que usar el método List<T>.Add(T).

CollectionSize Test                TotalMilliseconds RelativeSpeed
-------------- ----                ----------------- -------------
          5120 Direct Assignment                4.71 1x
          5120 Array+= Operator                40.42 8.58x slower
          5120 List<T>.Add(T)                  92.17 19.57x slower


CollectionSize Test                TotalMilliseconds RelativeSpeed
-------------- ----                ----------------- -------------
         10240 Direct Assignment                1.76 1x
         10240 Array+= Operator               104.73 59.51x slower
         10240 List<T>.Add(T)                 173.00 98.3x slower