about_PSReadLine

Descripción corta

PSReadLine proporciona una experiencia de edición de línea de comandos mejorada en la consola de PowerShell.

Descripción larga

PowerShell 7.3 se incluye con PSReadLine 2.2.6. La versión actual es PSReadLine 2.3.4. La versión actual de PSReadLine se puede instalar y usar en Windows PowerShell 5.1 y versiones posteriores. Para algunas características, debe ejecutar PowerShell 7.2 o posterior.

PSReadLine proporciona una eficaz experiencia de edición de línea de comandos para la consola de PowerShell. Proporciona:

  • Coloración de sintaxis de la línea de comandos
  • Indicación visual de errores de sintaxis
  • Una mejor experiencia de varias líneas (tanto edición como historial)
  • Enlaces de claves personalizables
  • Modos cmd y Emacs
  • Muchas opciones de configuración
  • Finalización del estilo de Bash (opcional en modo Cmd, valor predeterminado en modo Emacs)
  • Emacs yank/kill-ring
  • Movimiento y eliminación de tokens de PowerShell basados en "palabras"
  • IntelliSense predictivo
  • Visualización dinámica de la Ayuda en la consola sin perder su lugar en la línea de comandos

PSReadLine requiere PowerShell 5.1 o posterior. PSReadLine funciona con el host de consola de Windows predeterminado, Terminal Windows y Visual Studio Code. No funciona en Windows PowerShell ISE.

PSReadLine se puede instalar desde el Galería de PowerShell. Para instalar PSReadLine en una versión compatible de PowerShell, ejecute el siguiente comando.

Install-Module -Name PSReadLine -AllowClobber -Force

Nota:

A partir de PowerShell 7.0, PowerShell omite la carga automática de PSReadLine en Windows si se detecta un programa de lector de pantalla. Actualmente, PSReadLine no funciona bien con los lectores de pantalla. La representación y el formato predeterminados de PowerShell 7.0 en Windows funcionan correctamente. Si es necesario, puede cargar manualmente el módulo.

IntelliSense predictivo

IntelliSense predictivo es una adición al concepto de finalización de tabulación que ayuda al usuario a completar correctamente los comandos. Permite a los usuarios detectar, editar y ejecutar comandos completos basados en predicciones coincidentes del historial del usuario y complementos específicos de dominio adicionales.

Habilitar IntelliSense predictivo

IntelliSense predictivo está desactivado de forma predeterminada. Para habilitar las predicciones, solo tiene que ejecutar el siguiente comando:

Set-PSReadLineOption -PredictionSource History

El parámetro PredictionSource también puede aceptar complementos para requisitos específicos y personalizados del dominio.

Para deshabilitar IntelliSense predictivo, solo tiene que ejecutar lo siguiente:

Set-PSReadLineOption -PredictionSource None

Nota:

IntelliSense predictivo está habilitado de forma predeterminada en PSReadLine 2.2.6. Para obtener más información, consulte el historial de versiones de PSReadLine en la sección Notas a continuación.

Enlaces de clave personalizados

PSReadLine admite enlaces de claves personalizados mediante el Set-PSReadLineKeyHandler cmdlet . La mayoría de los enlaces de clave personalizados llaman a una de las funciones enlazables, por ejemplo,

Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward

Puede enlazar un ScriptBlock a una clave. ScriptBlock puede hacer prácticamente todo lo que quiera. Algunos ejemplos útiles son:

  • editar la línea de comandos
  • abrir una nueva ventana (por ejemplo, ayuda)
  • cambiar directorios sin cambiar la línea de comandos

ScriptBlock recibe dos argumentos:

  • $key - Objeto [ConsoleKeyInfo] que es la clave que desencadenó el enlace personalizado. Si enlaza el mismo ScriptBlock a varias claves y necesita realizar diferentes acciones en función de la clave, puede comprobar $key. Muchos enlaces personalizados omiten este argumento.

  • $arg : argumento arbitrario. Normalmente, este sería un argumento entero que el usuario pasa de los enlaces de clave DigitArgument. Si el enlace no acepta argumentos, es razonable omitir este argumento.

Echemos un vistazo a un ejemplo que agrega una línea de comandos al historial sin ejecutarla. Esto es útil cuando se da cuenta de que olvidó hacer algo, pero no desea volver a escribir la línea de comandos que ya ha escrito.

$parameters = @{
    Key = 'Alt+w'
    BriefDescription = 'SaveInHistory'
    LongDescription = 'Save current line in history but do not execute'
    ScriptBlock = {
      param($key, $arg)   # The arguments are ignored in this example

      # GetBufferState gives us the command line (with the cursor position)
      $line = $null
      $cursor = $null
      [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line,
        [ref]$cursor)

      # AddToHistory saves the line in history, but does not execute it.
      [Microsoft.PowerShell.PSConsoleReadLine]::AddToHistory($line)

      # RevertLine is like pressing Escape.
      [Microsoft.PowerShell.PSConsoleReadLine]::RevertLine()
  }
}
Set-PSReadLineKeyHandler @parameters

Puede ver muchos más ejemplos en el archivo SamplePSReadLineProfile.ps1, que se instala en la carpeta del módulo PSReadLine .

La mayoría de los enlaces clave usan algunas funciones auxiliares para editar la línea de comandos. Esas API se documentan en about_PSReadLine_Functions.

Notas

Historial de comandos

PSReadLine mantiene un archivo de historial que contiene todos los comandos y datos que ha escrito desde la línea de comandos. Los archivos de historial son un archivo denominado $($host.Name)_history.txt. En los sistemas Windows, el archivo de historial se almacena en $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine. En sistemas que no son windows, los archivos de historial se almacenan en $env:XDG_DATA_HOME/powershell/PSReadLine o $env:HOME/.local/share/powershell/PSReadLine.

El historial puede contener datos confidenciales, incluidas las contraseñas. PSReadLine intenta filtrar la información confidencial. Las líneas de comandos que contengan las siguientes cadenas no se escriben en el archivo de historial.

  • password
  • asplaintext
  • token
  • apikey
  • secret

PSReadLine 2.2.0 mejora el filtrado de datos confidenciales

  • Usa el árbol de sintaxis abstracta de PowerShell (AST) de la línea de comandos analizada para buscar datos confidenciales.
  • Usa una lista de permitidos de cmdlets seguros del módulo SecretManagement para permitir que esos comandos se agreguen al historial. La lista de permitidos contiene:
    • Get-Secret
    • Get-SecretInfo
    • Get-SecretVault
    • Register-SecretVault
    • Remove-Secret
    • Set-SecretInfo
    • Set-SecretVaultDefault
    • Test-SecretVault
    • Unlock-SecretVault
    • Unregister-SecretVault

Por ejemplo, se permiten escribir los siguientes comandos en el archivo de historial:

Get-Secret PSGalleryApiKey -AsPlainText # Get-Secret is in the allowlist
$token = Get-Secret -Name github-token -Vault MySecret
[MyType]::CallRestAPI($token, $url, $args)
$template -f $token

Los siguientes comandos no se escriben en el archivo de historial:

$token = 'abcd' # Assign expr-value to sensitive variable name.
Set-Secret abc $mySecret # Set-Secret is not in the allowlist.
ConvertTo-SecureString stringValue -AsPlainText # '-AsPlainText' is an alert.
Invoke-WebRequest -Token xxx # Expr-value as argument to '-Token'.
Get-ResultFromTwo -Secret1 (Get-Secret -Name blah -AsPlainText) -Secret2 sdv87ysdfayf798hfasd8f7ha # '-Secret2' has expr-value argument.

Si hay otros comandos que no desea escribir en los archivos de historial, puede usar el parámetro AddToHistoryHandler del Set-PSReadLineOption cmdlet . Para obtener un ejemplo de cómo usar AddToHistoryHandler, vea ejemplo 7 de Set-PSReadLineOption.

PSReadLine 2.3.4 mejora el filtrado de datos confidenciales

Se ha mejorado la limpieza predeterminada del historial confidencial para permitir que el historial contenga acceso seguro a las propiedades.

Cuando la cadena confidencial forma parte de un acceso de propiedad:

  • Si esta operación de acceso a miembros no forma parte de una asignación, consideramos que es segura.
  • De lo contrario, si el lado derecho es una canalización o una variable, también lo consideramos seguro.

Por ejemplo, los siguientes casos de uso se consideran seguros y se pueden guardar en el historial.

$a.Secret = Get-Secret -Name github-token -Vault MySecret
$a.Secret = $secret
$a.Password.Secret | Set-Value
$token = (Get-AzAccessToken -ResourceUrl 'https://app.contoso.com').Token

La versión también ha mejorado la limpieza del historial confidencial para permitir la recuperación del token mediante las azherramientas de línea de comandos , gcloudy kubectl .

Por ejemplo, los siguientes casos de uso se consideran seguros y se pueden guardar en el historial.

kubectl get secrets
kubectl get secret db-user-pass -o jsonpath='{.data.password}' | base64 --decode
kubectl describe secret db-user-pass
az account get-access-token --resource=https://app.contoso.com --query accessToken --output tsv
$env:PGPASS = gcloud auth print-access-token

Historial de versiones de PSReadLine

Ha habido muchas actualizaciones de PSReadLine desde la versión que se incluye en Windows PowerShell 5.1.

  • La versión actual es PSReadLine 2.3.4
  • PowerShell 7.4 se incluye con PSReadLine 2.3.4
  • PowerShell 7.3 se incluye con PSReadLine 2.2.6
  • PowerShell 7.2 se incluye con PSReadLine 2.1.0
  • PowerShell 7.0.11 incluido con PSReadLine 2.0.4
  • PowerShell 5.1 se incluye con PSReadLine 2.0.0

Para obtener una lista completa de los cambios, consulte changeLog de PSReadLine.

  • PSReadLine 2.3.4

Además de varias correcciones de errores, esta versión incluye las siguientes mejoras:

  • ListView desplazable para IntelliSense predictivo

    • Autoajusta el tamaño en función del tamaño de la ventana del terminal.
    • Puede contener hasta 50 resultados de predicción.
    • Encabezado de lista dinámica que muestra el número de resultados y el origen de predicción actual
  • Se ha mejorado la limpieza del historial confidencial para permitir la recuperación del token de az, gcloudy kubectl

  • Mejora del limpieza del historial confidencial predeterminado para permitir el acceso seguro a las propiedades

  • Se ha agregado compatibilidad con mayúsculas, minúsculas y palabras en mayúsculas.

  • La finalización de tabulación muestra los resultados cuyo ListItemText valor es diferente solo por mayúsculas y minúsculas

  • Admite el comando <d,i,w> text-object en el modo de edición VI.

  • Cambio del color predeterminado para la predicción insertada a atenuado

  • Agregue un ejemplo a README para transformar el punto de código Unicode a Unicode char by Alt+x

  • Agregue la opción TerminateOrphanedConsoleApps en Windows para eliminar el proceso huérfano conectado a la consola que puede arruinar la lectura de la entrada de la consola.

  • PSReadLine 2.2.6

    En esta versión, la característica IntelliSense predictiva está habilitada de forma predeterminada en función de las condiciones siguientes:

    • Si se admite el terminal virtual (VT) y PSReadLine que se ejecuta en PowerShell 7.2 o posterior, PredictionSource se establece en HistoryAndPlugin
    • Si se admite VT y PSReadLine que se ejecuta en PowerShell antes de la versión 7.2, PredictionSource se establece en History
    • Si no se admite VT, PredictionSource se establece en None
  • PSReadLine 2.2.5

    Versión de mantenimiento oficial con correcciones de errores menores.

  • PSReadLine 2.2.2

    • PSReadLine ha agregado dos nuevas características predictivas de IntelliSense:
      • Se agregó el parámetro PredictionViewStyle para permitir la selección del nuevo ListView.
      • Conectar PSReadLine en CommandPrediction Las API introducidas en PowerShell 7.2 para permitir que un usuario pueda importar un módulo de predicción que pueda representar las sugerencias de un origen personalizado.
    • Se ha actualizado para usar la versión 1.0.0 de Microsoft.PowerShell.Pager para obtener ayuda dinámica.
    • Se ha mejorado la limpieza de elementos de historial confidenciales.
    • Muchas correcciones de errores y mejoras más pequeñas
  • PSReadLine 2.1.0

    Esta versión acumula las siguientes mejoras agregadas desde la versión 2.0.4:

    • Adición de sugerencias predictivas de IntelliSense desde el historial de comandos
    • Muchas correcciones de errores y mejoras de API
  • PSReadLine 2.0.4

    Esta versión acumula las siguientes mejoras agregadas desde la versión 2.0.0:

    • Se ha agregado el -Chord parámetro a Get-PSReadLineKeyHandler para permitir la búsqueda de enlaces de claves específicos.

Comentarios y contribución a PSReadLine

PSReadLine en GitHub

No dude en enviar una solicitud de incorporación de cambios o enviar comentarios en la página de GitHub.

Consulte también

  • PSReadLine está muy influenciado por la biblioteca gnu readline .