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
paraTest-Path
al usarPathType
y el intervalo de fechas (#20942) (¡Gracias a @ArmaanMcleod!)- Anteriormente,
-OlderThan
se omitía si se especificaban juntos
- Anteriormente,
- 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 serializaBigInteger
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
paraSet-StrictMode
(#20554) (¡Gracias a @ArmaanMcleod!) - Agregar el finalizador de argumentos
-Verb
paraGet-Verb
/Get-Command
y refactorizarGet-Verb
(#20286) (Gracias @ArmaanMcleod) - Agregar el finalizador de argumentos
-Verb
paraStart-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 comandosSave-Help
/Update-Help
(#20678) (Gracias a @ArmaanMcleod)
Nuevos cmdlets
- Agregar cmdlets
ConvertTo-CliXml
yConvertFrom-CliXml
(#21063) (gracias @ArmaanMcleod!)
Mejoras en los cmdlets web
- Corrección para permitir que
-PassThru
y-Outfile
funcionen conjuntamente (#24086) - Agregue la propiedad
OutFile
enWebResponseObject
(#24047) - Mostrar nombre de archivo en
Invoke-WebRequest -OutFile -Verbose
(#24041) - Corrección de webCmdlets cuando
-Body
se especifica, peroContentType
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 conRegister-PSSessionConfiguration
(#23891) - Agregar las opciones
IgnoreComments
yAllowTrailingCommas
al cmdletTest-Json
(#23817) (gracias @ArmaanMcleod!) - Get-Help puede notificar parámetros con el atributo
ValueFromRemainingArguments
como canalizable (#23871) - Cambiar el tipo de
LineNumber
aulong
enSelect-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 vistaConciseView
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
aNew-Guid
(#20014) (¡Gracias a @CarloToso!) - Agregar el alias
r
al parámetro-Recurse
para el comandoGet-ChildItem
(#20100) (¡Gracias a @kilasuit!) - Agregar los alias
LP
aLiteralPath
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 porGet-Help
(#20994) - Agregar
HelpUri
aRemove-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 propiedadExitCode
sea accesible para el objetoProcess
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 dePSDrive
(#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 apwsh
(#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 cmdletsResolve-Path
yConvert-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
yConsoleGuiTools
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 controlarsetuid
ysticky
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:
- PSRedirectToVariable: permitir el redireccionamiento a una variable (#20381)
- PSNativeWindowsTildeExpansion: agregar expansión de tilde de la ñ para ejecutables nativos de Windows (#20402) (gracias @domsleee!)
- PSSerializeJSONLongEnumAsNumber -
ConvertTo-Json
ahora trata las enumeraciones grandes como números (#20999) (gracias @jborean93!)
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