Novedades de PowerShell 7.0

PowerShell 7.0 es una edición de código abierto multiplataforma (Windows, macOS y Linux) de PowerShell, que se ha creado para administrar entornos heterogéneos y una nube híbrida.

En esta versión presentamos una serie de características nuevas, entre las que se incluyen:

  • Paralelización de canalización con ForEach-Object -Parallel
  • Nuevos operadores:
    • Operador ternario: a ? b : c
    • Operadores de cadena de canalización: || y &&
    • Operadores condicionales nulos: ?? y ??=
  • Una vista de error simplificada y dinámica y Get-Error cmdlet para facilitar la investigación de errores
  • Una capa de compatibilidad que permite a los usuarios importar módulos en una sesión de Windows PowerShell implícita
  • Notificaciones de nueva versión automáticas
  • La capacidad de invocar recursos de DSC directamente desde PowerShell 7 (experimental)

Para ver una lista completa de las características y correcciones, consulte changelogs.

¿Dónde puedo instalar PowerShell?

PowerShell 7 admite actualmente los siguientes sistemas operativos en x64, a saber:

  • Windows 8.1 y 10
  • Windows Server 2012, 2012 R2, 2016 y 2019
  • macOS 10.13+
  • Red Hat Enterprise Linux (RHEL) / CentOS 7
  • Fedora 30+
  • Debian 9
  • Ubuntu LTS 16.04+
  • Alpine Linux 3.8+

Además, PowerShell 7.0 admite los tipos ARM32 y ARM64 de Debian, Ubuntu y ARM64 Alpine Linux.

Consulte las instrucciones de instalación del sistema operativo preferido Windows, macOSo Linux.

Aunque no se admite oficialmente, la comunidad también ha proporcionado paquetes para Arch y Kali Linux.

Nota

En la actualidad, Debian 10 y CentOS 8 no admiten la comunicación remota de WinRM. Para más información sobre cómo configurar la comunicación remota basada en SSH, consulte Comunicación remota de PowerShell a través de SSH.

Para más información actualizada sobre los sistemas operativos compatibles y el ciclo de vida de soporte técnico, consulte Ciclo de vida de soporte técnico de PowerShell Core.

Ejecución de PowerShell 7

PowerShell 7 se instala en un directorio separado de Windows PowerShell. Esto permite ejecutar PowerShell 7 en paralelo con Windows PowerShell 5.1. Para PowerShell 6. x, PowerShell 7 es una actualización local que quita PowerShell 6.x.

  • PowerShell 7 se instala en %programfiles%\PowerShell\7
  • La carpeta %programfiles%\PowerShell\7 se agrega a $env:PATH

Los paquetes del instalador de PowerShell 7 actualizan las versiones anteriores de PowerShell 6.x:

  • PowerShell 6.x en Windows: %programfiles%\PowerShell\6 se reemplaza por %programfiles%\PowerShell\7.
  • Linux: /opt/microsoft/powershell/6 se reemplaza por /opt/microsoft/powershell/7
  • macOS: /usr/local/microsoft/powershell/6 se reemplaza por /usr/local/microsoft/powershell/7

Nota

En Windows PowerShell, el archivo ejecutable para iniciar PowerShell se denomina powershell.exe. En la versión 6 y posteriores, el nombre del ejecutable se cambia para admitir la ejecución en paralelo. El nuevo nombre del ejecutable para iniciar PowerShell 7 es pwsh.exe. Las compilaciones de versión preliminar permanecen en su lugar como pwsh-preview en lugar de pwsh en el directorio de la versión preliminar 7.

Compatibilidad con versiones anteriores mejoradas con Windows PowerShell

PowerShell 7.0 marca un movimiento a .NET Core 3.1, lo que permite una mayor compatibilidad con versiones anteriores con los módulos de Windows PowerShell existentes. Esto incluye muchos módulos en Windows que requieren funcionalidad de GUI como Out-GridView y Show-Command, así como muchos módulos de administración de roles que se suministran como parte de Windows.

En Windows, se agrega un nuevo parámetro de modificador UseWindowsPowerShell a Import-Module. Este modificador crea un módulo de proxy en PowerShell 7 que usa un proceso local de Windows PowerShell para ejecutar implícitamente los cmdlets contenidos en ese módulo. Para más información, consulte Import-Module.

Para más información sobre qué módulos de Microsoft funcionan con PowerShell 7.0, vea la tabla de compatibilidad de módulos.

Ejecución en paralelo agregada a ForEach-Object

El cmdlet ForEach-Object, que itera los elementos de una colección, ahora tiene un paralelismo integrado con el nuevo parámetro Parallel.

De forma predeterminada, los bloques de script paralelos usan el directorio de trabajo actual del autor de la llamada que inició las tareas paralelas.

En este ejemplo se recuperan 50 000 entradas de registro de cinco registros del sistema en una máquina local Windows:

$logNames = 'Security','Application','System','Windows PowerShell','Microsoft-Windows-Store/Operational'

$logEntries = $logNames | ForEach-Object -Parallel {
    Get-WinEvent -LogName $_ -MaxEvents 10000
} -ThrottleLimit 5

$logEntries.Count

50000

El parámetro Parallel especifica el bloque de script que se ejecuta en paralelo para cada nombre de registro de entrada.

El nuevo parámetro ThrottleLimit limita el número de bloques de scripts que se ejecutan en paralelo en un momento dado. El valor predeterminado es 5.

Use la variable $_ para representar el objeto de entrada actual en el bloque de scripts. Utilice el ámbito $using: para pasar las referencias de variable al bloque de script en ejecución.

Para más información, consulte ForEach-Object.

Operador ternario

PowerShell 7.0 introduce un operador ternario que se comporta como una instrucción if-else simplificada. El operador ternario de PowerShell se modela con bastante detalle a partir de la sintaxis de operador ternario de C#:

<condition> ? <if-true> : <if-false>

La expresión de la condición siempre se evalúa y su resultado se convierte en un valor booleano para determinar qué rama se evalúa a continuación:

  • La expresión <if-true> se ejecuta si la expresión de <condition> es true
  • La expresión <if-false> se ejecuta si la expresión de <condition> es false

Por ejemplo:

$message = (Test-Path $path) ? "Path exists" : "Path not found"

En este ejemplo, si la ruta de acceso existe, se muestra el mensaje La ruta existe. Si la ruta de acceso no existe, se muestra el mensaje Ruta no encontrada.

Para más información, consulte Acerca de If.

Operadores de cadena de canalización

PowerShell 7 implementa los operadores && y || para encadenar las canalizaciones de forma condicional. Estos operadores se conocen en PowerShell como "operadores de cadena de canalización" y son similares a las listas Y y O de los shells como bash y zsh, así como los símbolos de procesamiento condicional en el shell de comandos de Windows (cmd.exe).

El operador && ejecuta la canalización derecha, si la canalización izquierda se ha realizado correctamente. Por el contario, el operador || ejecuta la canalización derecha, si la canalización izquierda no se ha realizado correctamente.

Nota

Estos operadores usan las variables $? y $LASTEXITCODE para determinar si se produjo un error en una canalización. Esto le permite usarlas con comandos nativos y no solo con cmdlets o funciones.

Aquí, el primer comando se ejecuta correctamente y el segundo comando se ejecuta:

Write-Output 'First' && Write-Output 'Second'
First
Second

Aquí, el primer comando da error y el segundo no se ejecuta:

Write-Error 'Bad' && Write-Output 'Second'
Write-Error: Bad

Aquí, el primer comando se ejecuta correctamente y el segundo no se ejecuta:

Write-Output 'First' || Write-Output 'Second'
First

Aquí, el primer comando da error y el segundo se ejecuta:

Write-Error 'Bad' || Write-Output 'Second'
Write-Error 'Bad'
Second

Para más información, consulte Acerca de operadores de cadena de canalización.

Operadores condicionales, de asignación y de fusión de NULL

PowerShell 7 incluye el operador de fusión de NULL ??, el operador de asignación condicional NULL ??= y el operador de acceso a miembro condicional NULL ?. y ?[].

Operador de fusión de NULL ??

El operador de fusión de NULL ?? devuelve el valor de su operando de la izquierda si este no es NULL. De lo contrario, evalúa el operando de la derecha y devuelve su resultado. El operador ?? no evalúa su operando de la derecha si el operando de la izquierda se evalúa como no NULL.

$x = $null
$x ?? 100
100

En el ejemplo siguiente, el operando de la derecha no se evaluará:

[string] $todaysDate = '1/10/2020'
$todaysDate ?? (Get-Date).ToShortDateString()
1/10/2020

Operador de asignación condicional NULL ??=

El operador de asignación condicional NULL ??= asigna el valor del operando de la derecha a su operando de la izquierda solo si este último se evalúa como NULL. El operador ??= no evalúa su operando de la derecha si el operando de la izquierda se evalúa como no NULL.

$x = $null
$x ??= 100
$x
100

En el ejemplo siguiente, el operando de la derecha no se evalúa:

[string] $todaysDate = '1/10/2020'
$todaysDate ??= (Get-Date).ToShortDateString()
1/10/2020

Operadores de acceso a miembro condicional NULL ?. y ?[] (experimental)

Nota

Se trata de una característica experimental denominada PSNullConditionalOperators. Para obtener más información, vea Uso de las características experimentales.

Un operador condicional NULL permite el acceso a miembros, ?., o el acceso a elementos, ?[], a su operando solo si ese operando se evalúa como no NULL; de lo contrario, devuelve NULL.

Nota

Puesto que PowerShell permite que ? forme parte del nombre de la variable, se requiere la especificación formal del nombre de la variable para utilizar estos operadores. Por lo tanto, es necesario usar {} en torno a los nombres de variable como ${a} o cuando ? forma parte del nombre de la variable${a?}.

En el ejemplo siguiente, se devuelve el valor de la propiedad de miembro Status:

$Service = Get-Service -Name 'bits'
${Service}?.status
Stopped

En el ejemplo siguiente se devuelve NULL sin intentar acceder al nombre de miembro Status:

$service = $Null
${Service}?.status

De forma parecida, si se usa ?[], se devuelve el valor del elemento:

$a = 1..10
${a}?[0]
1

Y cuando el operando es NULL, no se accede al elemento y se devuelve NULL:

$a = $null
${a}?[0]

Para más información, consulte Acerca de los operadores.

Nueva vista ConciseView y cmdlet Get-Error

PowerShell 7.0 mejora la visualización de los mensajes de error para aumentar la legibilidad de los errores interactivos y de script con una nueva vista predeterminada, ConciseView. Las vistas las puede seleccionar el usuario a través de la variable de preferencia $ErrorView.

Con ConciseView, si no se trata de un error de script o de analizador, es de un mensaje de error de una sola línea:

Get-Childitem -Path c:\NotReal
Get-ChildItem: can't find path 'C:\NotReal' because it doesn't exist

Si el error se produce durante la ejecución del script o es un error de análisis, PowerShell devuelve un mensaje de error de varias líneas que contiene el error, un puntero y un mensaje de error que muestra dónde se encuentra el error en esa línea. Si el terminal no es compatible con las secuencias de escape de color ANSI (VT100), no se mostrarán los colores.

Visualización de errores desde un script

La vista predeterminada de PowerShell 7 es ConciseView. La vista predeterminada anterior era NormalView; para seleccionarla, el usuario puede establecer la variable de preferencia $ErrorView.

$ErrorView = 'NormalView' # Sets the error view to NormalView
$ErrorView = 'ConciseView' # Sets the error view to ConciseView

Nota

Se agrega una nueva propiedad ErrorAccentColor a $Host.PrivateData para admitir el cambio del color de énfasis del mensaje de error.

Un nuevo cmdlet Get-Error proporciona una vista detallada del error completo cuando se solicite. De forma predeterminada, el cmdlet muestra todos los detalles, incluidas las excepciones internas, del último error que se produjo.

Mostrar desde Get-error

El cmdlet Get-Error admite la entrada desde la canalización mediante la variable $Error integrada. Get-Error muestra todos los errores canalizados.

$Error | Get-Error

El cmdlet Get-Error admite el parámetro Newest, lo que le permite especificar el número de errores de la sesión actual que desea mostrar.

Get-Error -Newest 3 # Displays the lst three errors that occurred in the session

Para más información, consulte Get-Error.

Notificación de nueva versión

PowerShell 7 usa notificaciones de actualización para alertar a los usuarios de la existencia de actualizaciones de PowerShell. Una vez al día, PowerShell consulta un servicio en línea para determinar si hay disponible una versión más reciente.

Nota

La comprobación de la actualización tiene lugar durante la primera sesión en un período de 24 horas determinado. Por motivos de rendimiento, la comprobación de actualizaciones se inicia 3 segundos después de que lo haga la sesión. La notificación solo se muestra en el inicio de sesiones posteriores.

De forma predeterminada, PowerShell se suscribe a uno de dos canales de notificación diferentes, en función de su versión o rama. Las versiones de disponibilidad general (GA) y admitidas de PowerShell solo devuelven notificaciones para las versiones de disponibilidad general actualizadas. Las versiones preliminares y candidatas para lanzamiento (RC) notifican las actualizaciones de versiones preliminares, RC y GA.

El comportamiento de las notificaciones de actualización se puede cambiar mediante la variable de entorno $Env:POWERSHELL_UPDATECHECK. Se admiten los valores siguientes:

  • Default es el mismo que no definir $Env:POWERSHELL_UPDATECHECK
    • Las versiones de disponibilidad general notifican las actualizaciones de dichas versiones
    • Las versiones preliminares y RC notifican las actualizaciones de GA y las versiones de versión preliminar
  • Off desactiva la característica de notificación de actualización
  • LTS solo informa de las actualizaciones de las versiones de disponibilidad general de mantenimiento a largo plazo (LTS)

Nota

La variable de entorno $Env:POWERSHELL_UPDATECHECK no existe hasta que se establece por primera vez.

Para establecer la notificación de versión solo para las versiones LTS:

$Env:POWERSHELL_UPDATECHECK = 'LTS'

Para establecer la notificación de versión en el comportamiento Default:

$Env:POWERSHELL_UPDATECHECK = 'Default'

Para más información, consulte Acerca de las notificaciones de actualización.

Nueva compatibilidad de recursos de DSC con Invoke-DSCResource (experimental)

Nota

Se trata de una característica experimental denominada PSDesiredStateConfiguration.InvokeDscResource. Para obtener más información, vea Uso de las características experimentales.

El cmdlet Invoke-DscResource ejecuta un método de un recurso de Desired State Configuration (DSC) de PowerShell especificado.

Este cmdlet invoca un recurso de DSC directamente, sin crear un documento de configuración. Con este cmdlet, los productos de administración de configuración pueden administrar Windows o Linux mediante recursos de DSC. Este cmdlet también habilita la depuración de recursos cuando el motor de DSC se está ejecutando con la depuración habilitada.

Este comando invoca el método Set de un recurso denominado WindowsProcess, y proporciona la ruta de acceso obligatoria (Path) y las propiedades de los argumentos (Arguments) para iniciar el proceso de Windows especificado.

Invoke-DscResource -Name WindowsProcess -Method Set -ModuleName PSDesiredStateConfiguration -Property @{
  Path = 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'
  Arguments = ''
}

Para más información sobre Invoke-DSCResource.

Últimos cambios y mejoras

Últimos cambios

  • Crear LTS para compatibilidad con notificaciones de actualización y los canales predeterminados (n.º 11132)
  • Actualizar Test-Connection para que funcione más como en Windows PowerShell (n.º 10697) (¡Gracias @vexx32!)!)
  • Conservar $? para ParenExpression, SubExpression y ArrayExpression (n.º 11040)
  • Establecer el directorio de trabajo en el directorio actual en Start-Job (n.º 10920) (¡Gracias @iSazonov!)!)
  • Hacer que $PSCulture refleje de forma coherente los cambios en la referencia cultural en la sesión (n.º 10138) (¡Gracias @iSazonov!)!)

Actualizaciones y correcciones del motor

  • Mejoras en las API de punto de interrupción para escenarios remotos (n.º 11312)
  • Corregir la pérdida de definiciones de clase de PowerShell en otro espacio de ejecución (n.º 11273)
  • Corregir una regresión en el formato causada por la primitiva FirstOrDefault agregada en 7.0.0-Preview1 (n.º 11258)
  • Módulos adicionales de Microsoft para realizar el seguimiento en la telemetría de PS7 (n.º 10751)
  • Hacer que las características aprobadas no sean experimentales (n.º 11303)
  • Actualizar ConciseView para usar TargetObject si es aplicable (n.º 11075)
  • Corregir NullReferenceException en métodos públicos de CompletionCompleters (n.º 11274)
  • Corregir la comprobación de estado de subprocesos de apartamento en plataformas que no son de Windows (n.º 11301)
  • Actualizar el valor de PSModulePath para concatenar las variables de entorno de proceso y máquina (n.º 11276)
  • Incrementar la versión de .NET Core a 3.1.0 (n.º 11260)
  • Corregir la detección de $PSHOME delante de $env:PATH (n.º 11141)
  • Permitir a pwsh heredar $env:PSModulePath y habilitar PowerShell.exe para que se inicie correctamente (n.º 11057)
  • Pasar a .NET Core 3.1 Preview 1 (10798)
  • Refactorizar comprobaciones de etiquetas de reanálisis en el proveedor del sistema de archivos (n.º 10431) (¡Gracias @iSazonov!)!)
  • Reemplazar CR y nueva línea por un carácter 0x23CE en el registro de scripts (n.º 10616)
  • Corregir una pérdida de recursos al anular el registro del controlador de eventos de AppDomain.CurrentDomain.ProcessExit (n.º 10626)
  • Agregar compatibilidad a ActionPreference.Break para interrumpir el depurador cuando se generan mensajes de depuración, error, información, progreso, detallados o advertencia (n.º 8205) (¡Gracias @KirkMunro!)!)
  • Habilitar el inicio de complementos del panel de control dentro de PowerShell sin especificar la extensión .CPL (n.º 9828)
  • Compatibilidad con números negativos en el operador -split (n.º 8960) (¡Gracias @ece-jacob-scott!)!)

Actualizaciones y correcciones generales de cmdlet

  • Corrección para el problema en Raspbian para establecer la fecha de los cambios de archivo en la característica experimental UnixStat (n.º 11313)
  • Agregar -AsPlainText a ConvertFrom-SecureString (n.º 11142)
  • Se ha agregado la comprobación de la versión de WindowsPS para WinCompat (n.º 11148)
  • Corregir la generación de informes de error en algunos escenarios de WinCompat (n.º 11259)
  • Agregar resolución binaria nativa (n.º 11032) (¡Gracias @iSazonov!)!)
  • Actualiza el cálculo del ancho de carácter para respetar los caracteres CJK correctamente (n.º 11262)
  • Agregar Unblock-File para macOS (n.º 11137)
  • Corregir la regresión en Get-PSCallStack (n.º 11210) (¡Gracias @iSazonov!)!)
  • Quitar la carga automática del módulo ScheduledJob al usar cmdlets de trabajo (n.º 11194)
  • Agregar OutputType al cmdlet Get-Error y conservar los nombres de tipo originales (n.º 10856)
  • Corregir la referencia nula en la propiedad SupportsVirtualTerminal (n.º 11105)
  • Agregar comprobación de límite en Get-WinEvent (n.º 10648) (¡Gracias @iSazonov!)!)
  • Corregir del tiempo de ejecución de los comandos para que StopUpstreamCommandsException no se rellene en -ErrorVariable (n.º 10840)
  • Establecer la codificación de salida en [Console]::OutputEncoding para los comandos nativos (n.º 10824)
  • Compatibilidad con bloques de código de varias líneas en ejemplos (n.º 10776) (¡Gracias @Greg-Smulko!)!)
  • Agregar el parámetro Culture al cmdlet Select-String (n.º 10943) (¡Gracias @iSazonov!)!)
  • Corregir la ruta de acceso del directorio de trabajo Start-Job con la barra diagonal inversa final (n.º 11041)
  • ConvertFrom-Json: Desencapsular colecciones de forma predeterminada (n.º 10861) (¡Gracias @danstur!)!)
  • Usar la tabla hash con distinción de mayúsculas y minúsculas para el cmdlet Group-Object con los modificadores -CaseSensitive y -AsHashtable (n.º 11030) (¡Gracias @vexx32!)!)
  • Controlar la excepción si se produce un error en la enumeración de los archivos al volver a generar la ruta de acceso para tener el uso correcto de mayúsculas y minúsculas (n.º 11014)
  • Corregir ConciseView para mostrar la actividad en lugar de myCommand (n.º 11007)
  • Permitir que los cmdlets web omitan los estados de error HTTP (n.º 10466) (¡Gracias @vdamewood!)!)
  • Corregir la canalización de más de un CommandInfo a Get-Command (n.º 10929)
  • Volver a agregar el cmdlet Get-Counter para Windows (n.º 10933)
  • Hacer que ConvertTo-Json trate [AutomationNull]::Value y [NullString]::Value como $null (n.º 10957)
  • Quitar corchetes de la dirección IPv6 para la comunicación remota SSH (n.º 10968)
  • Corregir el bloqueo si el comando enviado a pwsh es simplemente un espacio en blanco (n.º 10977)
  • Se ha agregado Get-Clipboard y Set-Clipboard entre plataformas (n.º 10340)
  • Corregir el establecimiento de la ruta de acceso original del objeto filesystem para que no tenga una barra diagonal final (n.º 10959)
  • Admitir $null para ConvertTo-JSON (n.º 10947)
  • Volver a agregar el comando Out-Printer en Windows (n.º 10906)
  • Corregir Start-Job -WorkingDirectory con espacio en blanco (n.º 10951)
  • Devolver el valor predeterminado al obtener null para un valor en PSConfiguration.cs (nº 10963) (¡Gracias @iSazonov!)!)
  • Controlar la excepción de E/S como de no terminación (n.º 10950)
  • Agregue el ensamblado GraphicalHost para habilitar Out-GridView, Show-Command y Get-Help-ShowWindow (n.º 10899)
  • Tomar ComputerName mediante la canalización en Get-HotFix (n.º 10852) (¡Gracias @kvprasoon!)!)
  • Corregir la finalización con tabulación de los parámetros para que muestre los parámetros comunes como disponibles (n.º 10850)
  • Corregir GetCorrectCasedPath () para comprobar primero si se devuelven las entradas de archivo del sistema antes de llamar a First() (n.º 10930)
  • Establecer el directorio de trabajo en el directorio actual en Start-Job (n.º 10920) (¡Gracias @iSazonov!)!)
  • Cambiar TabExpansion2 para no requerir -CursorColumn y tratar como $InputScript.Length (n.º 10849)
  • Identificador del caso en el que el host no puede devolver filas ni columnas de la pantalla (n.º 10938)
  • Corregir el uso de colores de énfasis para hosts que no los admiten (n.º 10937)
  • Volver a agregar el comando Update-List (n.º 10922)
  • Actualizar el identificador de vínculos redireccionables para Clear-RecycleBin (n.º 10925)
  • Durante la finalización con tabulación, omitir el archivo si no puede leer los atributos de archivo (n.º 10910)
  • Volver a agregar Clear-RecycleBin para Windows (n.º 10909)
  • Agregar $env:__SuppressAnsiEscapeSequences para controlar si se debe incluir la secuencia de escape de VT en la salida (n.º 10814)
  • Agregar el parámetro -NoEmphasize para colorear la salida Select-String (n.º 8963) (¡Gracias @derek-xia!)!)
  • Volver a agregar el cmdlet Get-HotFix (n.º 10740)
  • Hacer que Add-Type se pueda usar en aplicaciones que hospedan PowerShell (n.º 10587)
  • Usar un orden de evaluación más eficaz en LanguagePrimitives.IsNullLike () (n.º 10781) (¡Gracias @vexx32!)!)
  • Mejorar el control de la entrada canalizada de recopilación mixta y los flujos canalizados de entrada en Format-Hex (n.º 8674) (¡Gracias @vexx32!)!)
  • Usar conversión de tipos en tablas hash de SSHConnection cuando el valor no coincide con el tipo esperado (n.º 10720) (¡Gracias @SeeminglyScience!)!)
  • Corregir el comportamiento de Get-Content -ReadCount 0 cuando se establece -TotalCount (n.º 10749) (¡Gracias @eugenesmlv!)!)
  • Volver a redactar el mensaje de error de acceso denegado en Get-WinEvent (n.º 10639) (¡Gracias @iSazonov!)!)
  • Habilitar la finalización con tabulación para la asignación de variables que es una enumeración o tipo restringido (n.º 10646)
  • Quitar la propiedad de comunicación remota de SourceLength sin usar que causa problemas de formato (n.º 10765)
  • Agregar el parámetro -Delimiter a ConvertFrom-StringData (n.º 10665) (¡Gracias @steviecoaster!)!)
  • Agregar el parámetro posicional para ScriptBlock al usar Invoke-Command con SSH (n.º 10721) (¡Gracias @machgo!)!)
  • Mostrar información de contexto de línea si hay varias líneas pero no un nombre de script para ConciseView (n.º 10746)
  • Agregar compatibilidad para rutas de acceso \wsl$\ al proveedor del sistema de archivos (n.º 10674)
  • Agregar el texto de token que falta para TokenKind.QuestionMark en el analizador (n.º 10706)
  • Establecer el directorio de trabajo actual de cada script de ejecución ForEach-Object -Parallel en la misma ubicación que el script que realiza la llamada (n.º 10672)
  • Reemplazar api-ms-win-core-file-l1-2-2.dll por Kernell32.dll para las API FindFirstStreamW y FindNextStreamW (n.º 10680) (¡Gracias @iSazonov!)!)
  • Ajustar el script de formato de ayuda para que sea más tolerante a StrictMode (n.º 10563)
  • Agregar el parámetro Add -SecurityDescriptorSDDL a New-Service (n.º 10483) (¡Gracias @kvprasoon!)!)
  • Quitar la salida de información, consolidar el uso de ping en Test-Connection (n.º 10478) (¡Gracias @vexx32!)!)
  • Leer puntos especiales de reanálisis sin acceder a ellos (n.º 10662) (¡Gracias @iSazonov!)!)
  • Salida directa de Clear-Host al terminal (n.º 10681) (¡Gracias @iSazonov!)!)
  • Volver a agregar una nueva línea para la agrupación con Format-Table y -Property (n.º 10653)
  • Quitar [ValidateNotNullOrEmpty] de -InputObject en Get-Random para permitir una cadena vacía (n.º 10644)
  • Convertir el algoritmo de distancia de la cadena del sistema de sugerencias para distinguir mayúsculas de minúsculas (n.º 10549) (¡Gracias @iSazonov!)!)
  • Corregir la excepción de referencia nula en el procesamiento de entrada ForEach-Object -Parallel (nº 10577)
  • Agregar definiciones de directiva de grupo de PowerShell (n.º 10468)
  • Actualizar el host de la consola para que admita las secuencias de control VT XTPUSHSGR/XTPOPSGR que se usan en escenarios composición (n.º 10208)
  • Agregar el parámetro WorkingDirectory a Start-Job (n.º 10324) (¡Gracias @davinci26!)!)
  • Quitar el controlador de eventos que hacía que los cambios de punto de interrupción se replicaran erróneamente en el depurador del espacio de ejecución del host (nº 10503) (¡Gracias @KirkMunro!)!)
  • Reemplazar api-ms-win-core-job-12-1-0.dll por Kernell32.dll en la API P/Invoke Microsoft.PowerShell.Commands.NativeMethods (n.º 10417) (¡Gracias @iSazonov!)!)
  • Corregir la salida incorrecta de New-Service en la asignación de variables y -OutVariable (nº 10444) (¡Gracias @kvprasoon!)!)
  • Corregir problemas de herramientas globales en torno al código de salida, parámetros de línea de comandos y ruta de acceso con espacios (n.º 10461)
  • Corregir la recursividad en OneDrive: cambiar FindFirstFileEx() para usar el tipo SafeFindHandle (n.º 10405)
  • Omitir la carga automática de PSReadLine en Windows si el lector de pantalla NVDA está activo (n.º 10385)
  • Aumentar las versiones del módulo de integradas con PowerShell a 7.0.0.0 (n.º 10356)
  • Agregar el inicio de un error en Add-Type si ya existe un tipo con el mismo nombre (n.º 9609) (¡Gracias @iSazonov!)!)

Rendimiento

  • Evitar el uso del cierre en Parser.SaveError (nº 11006)
  • Mejorar el almacenamiento en caché al crear instancias de Regex (n.º 10657) (¡Gracias @iSazonov!)!)
  • Mejorar el procesamiento de los datos de tipo integrados de PowerShell desde types.ps1xml, typesV3.ps1xml y GetEvent.types.ps1xml (n.º 10898)
  • Actualizar PSConfiguration.ReadValueFromFile para que sea más rápido y más eficiente de memoria (n.º 10839)
  • Agregar mejoras de rendimiento menores para la inicialización del espacio de ejecución (nº 10569) (¡Gracias @iSazonov!)!)
  • Hacer que ForEach-Object sea más rápido para sus escenarios de uso frecuente (n.º 10454) y corregir el problema de rendimiento de ForEach-Object-Parallel con muchos espacios de ejecución (n.º 10455)

Limpieza de código

  • Cambiar el texto del comentario y del elemento para cumplir los estándares de Microsoft (n.º 11304)
  • Problemas de estilo de limpieza en Compiler.cs (n.º 10368) (¡Gracias @iSazonov!)!)
  • Quitar el convertidor de tipos sin usar para CommaDelimitedStringCollection (n.º 11000) (¡Gracias @iSazonov!)!)
  • Estilo de limpieza en InitialSessionState.cs (n.º 10865) (¡Gracias @iSazonov!)!)
  • Limpieza de código para la clase PSSession (n.º 11001)
  • Quitar la característica "ejecutar Update-Help desde Get-Help cuando Get-Help se ejecuta por primera vez" que no funciona (n.º 10974)
  • Corregir problemas de estilo (nº 10998) (¡Gracias @iSazonov!)!)
  • Limpieza: usar el alias de tipo integrado (nº 10882) (¡Gracias @iSazonov!)!)
  • Quitar la clave de configuración no usada ConsolePrompting y evitar la creación de cadenas innecesaria al consultar la configuración de ExecutionPolicy (n.º 10985)
  • Deshabilitar la comprobación de notificaciones de actualización para compilaciones diarias (n.º 10903) (¡Gracias @bergmeister!)!)
  • Restablecer la API de depuración perdida en n.º 10338 (n.º 10808)
  • Eliminar la referencia de WorkflowJobSourceAdapter que ya no se usa (n.º 10326) (¡Gracias, @KirkMunro!)!)
  • Interfaces COM de limpieza en código de lista de salto mediante la corrección de atributos PreserveSig (n.º 9899) (¡Gracias @weltkante!)!)
  • Agregar un comentario que describa por qué -ia no es el alias del parámetro común -InformationAction (n.º 10703) (¡Gracias, @KirkMunro!)!)
  • Cambiar el nombre de InvokeCommandCmdlet.cs a InvokeExpressionCommand.cs (nº 10659) (¡Gracias @kilasuit!)!)
  • Agregar limpiezas de código secundarias relacionadas con las notificaciones de actualización (n.º 10698)
  • Quitar la lógica de flujo de trabajo en desuso de los scripts de configuración de comunicación remota (n.º 10320) (¡Gracias @KirkMunro!)!)
  • Actualizar el formato de la ayuda para usar mayúsculas y minúsculas adecuadas (n.º 10678) (¡Gracias @tnieto88!)!)
  • Problemas de estilo de CodeFactor de limpieza que aparecen en las confirmaciones durante el último mes (n.º 10591) (¡Gracias @iSazonov!)!)
  • Corrección de errores de escritura en la descripción de la característica experimental de PSTernaryOperator (nº 10586) (¡Gracias @bergmeister!)!)
  • Convertir el valor de enumeración ActionPreference.Suspend en un estado reservado y no compatible, y quitar la restricción al usar ActionPreference.Ignore en las variables de preferencia (n.º 10317) (¡Gracias @KirkMunro!)!)
  • Reemplazar ArrayList con List<T> para obtener código más legible y confiable sin cambiar la funcionalidad (n.º 10333) (¡Gracias @iSazonov!)!)
  • Crear correcciones de estilo de código para TestConnectionCommand (n.º 10439) (¡Gracias @vexx32!)!)
  • Limpiar AutomationEngine y quitar la llamada de método SetSessionStateDrive adicional (n.º 10416) (¡Gracias @iSazonov!)!)
  • Volver a cambiar el nombre de ParameterSetName predeterminado a Delimitador para ConvertTo-Csv y ConvertFrom-Csv (n.º 10425)

Herramientas

  • Agregar la configuración predeterminada de la propiedad SDKToUse para que se compile en VS (n.º 11085)
  • Install-Powershell.ps1: Agregar el parámetro para usar la instalación de MSI (n.º 10921) (¡Gracias @MJECloud!)!)
  • Agregar ejemplos básicos para install-PowerShell.ps1 (n.º 10914) (¡Gracias @kilasuit!)!)
  • Crear una cadena vacía de identificador Install-PowerShellRemoting.ps1 en el parámetro PowerShellHome (n.º 10526) (¡Gracias @Orca88!)!)
  • Cambiar de /etc/lsb-release a /etc/os-release en install-powershell.sh (n.º 10773) (¡Gracias @Himura2la!)!)
  • Comprobar pwsh.exe y pwsh en la versión diaria en Windows (n.º 10738) (¡Gracias @centreboard!)!)
  • Quitar la pulsación innecesaria en installpsh-osx.sh (n.º 10752)
  • Actualizar install-powershell.ps1 para comprobar la compilación diaria ya instalada (n.º 10489)

Pruebas

  • Hacer que una prueba de DSC no confiable esté pendiente (n.º 11131)
  • Corregir la prueba de stringdata para validar correctamente las claves de las tablas hash (n.º 10810)
  • Descargar módulos de prueba (n.º 11061) (¡Gracias @iSazonov!)!)
  • Aumentar el tiempo entre reintentos de prueba de direcciones URL (n.º 11015)
  • Actualizar las pruebas para describir con precisión las acciones de prueba. (n.º 10928) (¡Gracias @romero126!)!)
  • Omitir temporalmente la prueba no confiable TestAppDomainProcessExitEvenHandlerNotLeaking (n.º 10827)
  • Hacer que la prueba de pérdida de controlador de eventos sea estable (n.º 10790)
  • Sincronizar el uso de mayúsculas y minúsculas en CI YAML (n.º 10767) (¡Gracias @RDIL!)!)
  • Agregar prueba para la corrección de pérdida de controlador de eventos (n.º 10768)
  • Agregar prueba Get-ChildItem (n.º 10507) (¡Gracias @iSazonov!)!)
  • Reemplazar el idioma ambiguo para las pruebas de cambio a parámetro para precisión (n.º 10666) (¡Gracias @romero126!)!)
  • Agregar la comprobación experimental a las pruebas ForEach-Object -Parallel (n.º 10354) (¡Gracias @KirkMunro!)!)
  • Actualizar pruebas para la validación de Alpine (n.º 10428)

Mejoras en las compilaciones y los paquetes

  • Corregir la firma de paquetes Nuget para la compilación de paquetes coordinada (n.º 11316)
  • Actualizar dependencias de la Galería de PowerShell y NuGet (n.º 11323)
  • Incrementar la versión de Microsoft.ApplicationInsights de 2.11.0 a 2.12.0 (#11305)
  • Incrementar la versión de Microsoft.CodeAnalysis.CSharp de 3.3.1 a 3.4.0 (n.º 11265)
  • Actualiza los paquetes para Debian 10 y 11 (n.º 11236)
  • Habilitar solo las características experimentales anteriores a RC (n.º 11162)
  • Actualizar la versión mínima de macOS (n.º 11163)
  • Incrementar la versión de NJsonSchema de 10.0.27 a 10.0.28 (nº 11170)
  • Actualización de vínculos en README.md y metadata.JSON para Preview.5 (n.º 10854)
  • Seleccionar los archivos para las pruebas de cumplimiento que son propiedad de PowerShell (n.º 10837)
  • Permitir compilar el paquete win7x86 msix. (interno 10515)
  • Permitir que las versiones semánticas se pasen a la función NormalizeVersion (n.º 11087)
  • Incrementar la versión de .NET Core Framework a 3.1-preview.3 (n.º 11079)
  • Incrementar la versión de PSReadLine de 2.0.0-beta5 a 2.0.0-beta6 en /src/Modules (n.º 11078)
  • Incrementar la versión de Newtonsoft. JSON de 12.0.2 a 12.0.3 (n.º 11037) (n.º 11038)
  • Agregar paquetes de Debian 10, 11 y CentOS 8 (n.º 11028)
  • Cargar el archivo Json Build-Info con el campo ReleaseDate (n.º 10986)
  • Incrementar la versión de .NET Core Framework a 3.1-preview.2 (n.º 10993)
  • Habilitar la compilación del paquete MSIX x86 (n.º 10934)
  • Actualizar la dirección URL del script de instalación del SDK de dotnet en build.psm1 (n.º 10927)
  • Incrementar la versión de Markdig.Signed de 0.17.1 a 0.18.0 (n.º 10887)
  • Incrementar la versión de ThreadJob de 2.0.1 a 2.0.2 (n.º 10886)
  • Actualizar el manifiesto de AppX y el módulo de empaquetado para ajustarse a los requisitos de Microsoft Store (n.º 10878)
  • Actualizar la referencia de paquete para el SDK de PowerShell a preview.5 (10295 interno)
  • Actualizar ThirdPartyNotices.txt (n.º 10834)
  • Incrementar la versión de Microsoft.PowerShell.Native a 7.0.0-preview.3 (n.º 10826)
  • Incrementar la versión de Microsoft.ApplicationInsights de 2.10.0 a 2.11.0 (n.º 10608)
  • Incrementar la versión de NJsonSchema de 10.0.24 a 10.0.27 (n.º 10756)
  • Agregar compatibilidad con MacPorts al sistema de compilación (n.º 10736) (¡Gracias @Lucius-Q-User!)!)
  • Incrementar la versión de PackageManagement de 1.4.4 a 1.4.5 (n.º 10728)
  • Incrementar la versión de NJsonSchema de 10.0.23 a 10.0.24 (n.º 10635)
  • Agregar una variable de entorno para diferenciar la telemetría de cliente/servidor en MSI (n.º 10612)
  • Incrementar la versión de PSDesiredStateConfiguration de 2.0.3 a 2.0.4 (n.º 10603)
  • Incrementar la versión de Microsoft.CodeAnalysis.CSharp de 3.2.1 a 3.3.1 (n.º 10607)
  • Actualizar a .Net Core 3.0 RTM (n.º 10604) (¡Gracias @bergmeister!)!)
  • Actualizar el empaquetado MSIX a la versión de los requisitos de Windows Store (n.º 10588)
  • Incrementar la versión de PowerShellGet de 2.2 a 2.2.1 (n.º 10382)
  • Incrementar la versión de PackageManagement de 1.4.3 a 1.4.4 (n.º 10383)
  • Actualizar README.md y metadata.json para 7.0.0-preview. 4 (10011 interno)
  • Actualizar la versión de .Net Core 3.0 de Preview 9 a RC1 (n.º 10552) (¡Gracias @bergmeister!)!)
  • Corregir la generación de lista de ExperimentalFeature (9996 interno)
  • Incrementar la versión de PSReadLine de 2.0.0-beta4 a 2.0.0-beta5 (n.º 10536)
  • Corregir el script de compilación de versión para establecer la etiqueta de versión
  • Actualizar la versión de Microsoft.PowerShell.Native a 7.0.0-preview.2 (n.º 10519)
  • Actualizar a Netcoreapp 3.0 preview9 (n.º 10484) (¡Gracias @bergmeister!)!)
  • Asegurarse de que la compilación coordinada diaria funciona como una compilación diaria (nº 10464)
  • Actualizar la compilación del paquete combinado para liberar las compilaciones diarias (n.º 10449)
  • Quitar la referencia de appveyor (n.º 10445) (¡Gracias @RDIL!)!)
  • Incrementar la versión de NJsonSchema de 10.0.22 a 10.0.23 (n.º 10421)
  • Quitar la eliminación de la carpeta de compilación de linux-x64 porque algunas dependencias de Alpine lo necesitan (n.º 10407)

Contenido de la ayuda y la documentación

  • Refactorizar los registros de cambios en un registro por versión (nº 11165)
  • Corregir vínculos redireccionables para los documentos de ayuda en pantalla de PowerShell 7 (n.º 11071)
  • Actualizar CONTRIBUTING.md (n.º 11096) (¡Gracias @mklement0!)!)
  • Corregir vínculos de documento de instalación en README.md (n.º 11083)
  • Agrega ejemplos al script install-PowerShell.ps1 (n.º 11024) (¡Gracias @kilasuit!)!)
  • Corregir para el énfasis de Select-String e Import-DscResource en CHANGELOG.md (n.º 10890)
  • Quitar el vínculo obsoleto de powershell-beginners-guide.md (n.º 10926)
  • Combinar registros de cambios estables y de mantenimiento (n.º 10527)
  • Actualizar la versión de .NET usada en la documentación de compilación (n.º 10775) (¡Gracias @Greg-Smulko!)!)
  • Reemplazar los vínculos de MSDN a Microsoft Learn en powershell-beginners-guide.md (n.º 10778) (¡Gracias, @iSazonov!)!)
  • Corregir el vínculo de información general de DSC roto (n.º 10702)
  • Actualizar Support_Question.md para vincular a Stack Overflow como otro recurso de comunidad (n.º 10638) (¡Gracias @mklement0!)!)
  • Agregar la arquitectura de procesador a la plantilla de solicitud de distribución (n.º 10661)
  • Agregar un nuevo libro de PowerShell MoL a la documentación de aprendizaje de PowerShell (n.º 10602)
  • Actualizar README.md y los metadatos para las versiones v6.1.6 y v6.2.3 (n.º 10523)
  • Corregir un error de escritura en README.md (n.º 10465) (¡Gracias @vedhasp!)!)
  • Agregar una referencia al módulo PSKoans en la documentación de recursos de aprendizaje (n.º 10369) (¡Gracias @vexx32!)!)
  • Actualizar README.md y metadata.json para 7.0.0-preview.3 (n.º 10393)