Compartir a través de


about_PSReadLine

Descripción corta

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

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

  • v2.3.5 se distribuye por primera vez en PowerShell 7.4.2 y 7.5.0-preview.3
  • v2.3.4 se distribuye por primera vez en PowerShell 7.4.0-rc.1
  • v2.2.6 se distribuyó por primera vez en PowerShell 7.3.0
  • v2.1.0 se distribuye por primera vez en PowerShell 7.2.5
  • v2.0.4 se distribuyó por primera vez en PowerShell 7.0.11
  • v2.0.0 se incluye en Windows PowerShell 5.1

Para obtener más información sobre las diferencias de versión, consulte about_PSReadLine_Release_Notes.

Descripción larga

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"

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

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.

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

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 .