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"
- 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
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 az
herramientas de línea de comandos , gcloud
y 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
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 .