À propos de PSReadLine

Brève description

PSReadLine offre une expérience d’édition de ligne de commande améliorée dans la console PowerShell.

Description longue

PowerShell 7.3 est fourni avec PSReadLine 2.2.6. La version actuelle est PSReadLine 2.3.4. La version actuelle de PSReadLine peut être installée et utilisée sur Windows PowerShell 5.1 et versions ultérieures. Pour certaines fonctionnalités, vous devez exécuter PowerShell 7.2 ou version ultérieure.

PSReadLine offre une expérience puissante d’édition de ligne de commande pour la console PowerShell. Il offre :

  • Coloration de syntaxe de la ligne de commande
  • Indication visuelle des erreurs de syntaxe
  • Une meilleure expérience multiligne (édition et historique)
  • Liaisons de clés personnalisables
  • Modes Cmd et Emacs
  • De nombreuses options de configuration
  • Achèvement du style Bash (facultatif en mode Cmd, par défaut en mode Emacs)
  • Emacs tirer/tuer
  • Mouvement et suppression basés sur le jeton PowerShell
  • IntelliSense prédictif
  • Affichage dynamique de l’aide dans la console sans perdre votre place sur la ligne de commande

PSReadLine nécessite PowerShell 5.1 ou une version ultérieure. PSReadLine fonctionne avec l’hôte de console Windows par défaut, le terminal Windows et Visual Studio Code. Elle ne fonctionne pas dans Windows PowerShell ISE.

PSReadLine peut être installé à partir de PowerShell Gallery. Pour installer PSReadLine dans une version prise en charge de PowerShell, exécutez la commande suivante.

Install-Module -Name PSReadLine -AllowClobber -Force

Remarque

À compter de PowerShell 7.0, PowerShell ignore le chargement automatique de PSReadLine sur Windows si un programme de lecteur d’écran est détecté. Actuellement, PSReadLine ne fonctionne pas correctement avec les lecteurs d’écran. Le rendu et la mise en forme par défaut de PowerShell 7.0 sur Windows fonctionnent correctement. Vous pouvez charger manuellement le module si nécessaire.

IntelliSense prédictif

IntelliSense prédictif est un ajout au concept de saisie semi-automatique de tabulation qui aide l’utilisateur à terminer correctement les commandes. Il permet aux utilisateurs de découvrir, de modifier et d’exécuter des commandes complètes en fonction des prédictions correspondantes à partir de l’historique de l’utilisateur et d’autres plug-ins spécifiques au domaine.

Activer IntelliSense prédictif

IntelliSense prédictif est désactivé par défaut. Pour activer les prédictions, exécutez simplement la commande suivante :

Set-PSReadLineOption -PredictionSource History

Le paramètre PredictionSource peut également accepter des plug-ins pour les exigences spécifiques au domaine et personnalisées.

Pour désactiver IntelliSense prédictif, exécutez simplement :

Set-PSReadLineOption -PredictionSource None

Remarque

IntelliSense prédictif est activé par défaut dans PSReadLine 2.2.6. Pour plus d’informations, consultez l’historique des versions de PSReadLine dans la section Notes ci-dessous.

Liaisons de clés personnalisées

PSReadLine prend en charge les liaisons de clés personnalisées à l’aide de l’applet de commande Set-PSReadLineKeyHandler. La plupart des liaisons de clés personnalisées appellent l’une des fonctions pouvant être liées, par exemple

Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward

Vous pouvez lier un ScriptBlock à une clé. Le ScriptBlock peut faire presque tout ce que vous voulez. Voici quelques exemples utiles :

  • modifier la ligne de commande
  • ouverture d’une nouvelle fenêtre (par exemple, aide)
  • modifier les répertoires sans modifier la ligne de commande

ScriptBlock reçoit deux arguments :

  • $key : objet [ConsoleKeyInfo] clé qui a déclenché la liaison personnalisée. Si vous liez le même ScriptBlock à plusieurs clés et que vous devez effectuer différentes actions en fonction de la clé, vous pouvez vérifier $key. De nombreuses liaisons personnalisées ignorent cet argument.

  • $arg - Argument arbitraire. Le plus souvent, il s’agit d’un argument entier transmis par l’utilisateur à partir des liaisons de clé DigitArgument. Si votre liaison n’accepte pas d’arguments, il est raisonnable d’ignorer cet argument.

Examinons un exemple qui ajoute une ligne de commande à l’historique sans l’exécuter. Cela est utile lorsque vous réalisez que vous avez oublié de faire quelque chose, mais ne souhaitez pas entrer à nouveau la ligne de commande que vous avez déjà entrée.

$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

Vous pouvez voir de nombreux autres exemples dans le fichier SamplePSReadLineProfile.ps1, qui est installé dans le dossier de module PSReadLine.

La plupart des liaisons clés utilisent certaines fonctions d’assistance pour modifier la ligne de commande. Ces API sont documentées dans about_PSReadLine_Functions.

Remarques

Historique des commandes

PSReadLine gère un fichier d’historique contenant toutes les commandes et données que vous avez entrées à partir de la ligne de commande. Les fichiers d’historique sont un fichier nommé $($host.Name)_history.txt. Sur les systèmes Windows, le fichier d’historique est stocké à $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine. Sur les systèmes non Windows, les fichiers d’historique sont stockés à $env:XDG_DATA_HOME/powershell/PSReadLine ou $env:HOME/.local/share/powershell/PSReadLine.

L’historique peut contenir des données sensibles, y compris des mots de passe. PSReadLine tente de filtrer les informations sensibles. Les lignes de commande contenant les chaînes suivantes ne sont pas écrites dans le fichier d’historique.

  • password
  • asplaintext
  • token
  • apikey
  • secret

PSReadLine 2.2.0 améliore le filtrage des données sensibles

  • Utilise l’arborescence de syntaxe abstraite PowerShell (AST) de la ligne de commande analysée pour rechercher des données sensibles.
  • Utilise une liste verte d’applets de commande sécurisées à partir du module SecretManagement pour permettre à ces commandes d’être ajoutées à l’historique. La liste verte contient :
    • Get-Secret
    • Get-SecretInfo
    • Get-SecretVault
    • Register-SecretVault
    • Remove-Secret
    • Set-SecretInfo
    • Set-SecretVaultDefault
    • Test-SecretVault
    • Unlock-SecretVault
    • Unregister-SecretVault

Par exemple, les commandes suivantes sont autorisées à être écrites dans le fichier d’historique :

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

Les commandes suivantes ne sont pas écrites dans le fichier d’historique :

$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.

S’il existe d’autres commandes que vous ne souhaitez pas écrire dans les fichiers d’historique, vous pouvez utiliser le paramètre AddToHistoryHandler de l’applet de commande Set-PSReadLineOption. Pour obtenir un exemple d’utilisation AddToHistoryHandler, consultez l’exemple 7 de Set-PSReadLineOption.

PSReadLine 2.3.4 améliore le filtrage des données sensibles

Amélioration du nettoyage de l’historique sensible par défaut pour permettre à l’historique de contenir un accès sécurisé aux propriétés.

Lorsque la chaîne sensible fait partie d’un accès aux propriétés :

  • Si cette opération d’accès aux membres ne fait pas partie d’une affectation, nous considérons qu’elle est sécurisée
  • Sinon, si le côté droit est un pipeline ou une variable, nous considérons également qu’il est sûr

Par exemple, les cas d’usage suivants sont considérés comme sécurisés et peuvent être enregistrés dans l’historique.

$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 version a également amélioré le nettoyage de l’historique sensible pour permettre la récupération du jeton à l’aide du az, du gcloudet des outils en ligne de commande kubectl.

Par exemple, les cas d’usage suivants sont considérés comme sécurisés et peuvent être enregistrés dans l’historique.

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

Historique des versions PSReadLine

De nombreuses mises à jour ont été apportées à PSReadLine depuis la version fournie dans Windows PowerShell 5.1.

  • La version actuelle est PSReadLine 2.3.4
  • PowerShell 7.4 est livré avec PSReadLine 2.3.4
  • PowerShell 7.3 est livré avec PSReadLine 2.2.6
  • PowerShell 7.2 est livré avec PSReadLine 2.1.0
  • PowerShell 7.0.11 est livré avec PSReadLine 2.0.4
  • PowerShell 5.1 est livré avec PSReadLine 2.0.0

Pour obtenir la liste complète des modifications, consultez le journal des modifications de PSReadLine.

  • PSReadLine 2.3.4

Outre plusieurs correctifs de bogues, cette version inclut les améliorations suivantes :

  • ListView défilant pour IntelliSense prédictif

    • Réajuste automatiquement la taille en fonction de la taille de la fenêtre de terminal
    • Peut contenir jusqu’à 50 résultats de prédiction
    • En-tête de liste dynamique qui affiche le nombre de résultats et la source de prédiction actuelle
  • Amélioration du nettoyage de l'historique sensible pour permettre de récupérer les jetons de az, gcloud et kubectl

  • Améliorer le nettoyage de l’historique sensible par défaut pour autoriser l’accès sécurisé aux propriétés

  • Ajout de la prise en charge de la mise en majuscule, de la mise en minuscule et de la mise en majuscule des mots.

  • L'achèvement de la tabulation permet d'afficher les résultats dont les ListItemText ne diffèrent que par la casse.

  • Prend en charge la commande text-object <d,i,w> en mode d’édition VI

  • Modification de la couleur par défaut de la prédiction en ligne pour la rendre plus discrète

  • Ajoutez un exemple à README pour transformer le point de code Unicode en caractères Unicode par Alt+x

  • Ajoutez l’option TerminateOrphanedConsoleApps sous Windows pour arrêter les processus orphelins attachés à la console qui peuvent perturber la lecture à partir de l’entrée de la console

  • PSReadLine 2.2.6

    Dans cette version, la fonctionnalité IntelliSense prédictive est activée par défaut en fonction des conditions suivantes :

    • Si le terminal virtuel (VT) est pris en charge et que PSReadLine s’exécute dans PowerShell 7.2 ou version ultérieure, PredictionSource est défini sur HistoryAndPlugin
    • Si VT est pris en charge et que PSReadLine s’exécute dans PowerShell avant la version 7.2, PredictionSource est défini sur History
    • Si VT n'est pas pris en charge, PredictionSource est défini sur None
  • PSReadLine 2.2.5

    Version officielle de maintenance avec des correctifs de bogues mineurs.

  • PSReadLine 2.2.2

    • PSReadLine a ajouté deux nouvelles fonctionnalités IntelliSense prédictives :
      • Ajout du paramètre PredictionViewStyle pour permettre la sélection du nouveau ListView.
      • Connexion de PSReadLine aux API de CommandPrediction introduites dans PowerShell 7.2 pour permettre à un utilisateur d’importer un module de prédiction pouvant afficher les suggestions à partir d’une source personnalisée.
    • Mise à jour pour utiliser la version 1.0.0 de Microsoft.PowerShell.Pager pour obtenir de l’aide dynamique
    • Amélioration du nettoyage des éléments d’historique sensibles
    • Beaucoup de correctifs de bogues et améliorations plus petites
  • PSReadLine 2.1.0

    Cette version cumule les améliorations suivantes ajoutées depuis la version 2.0.4 :

    • Ajouter des suggestions IntelliSense prédictives à partir de l’historique des commandes
    • De nombreux correctifs de bogues et améliorations de l’API
  • PSReadLine 2.0.4

    Cette version regroupe les améliorations suivantes ajoutées depuis la version 2.0.0 :

    • Ajout du -Chord paramètre to Get-PSReadLineKeyHandler pour permettre la recherche de raccourcis clavier spécifiques

Commentaires & contribution à PSReadLine

PSReadLine sur GitHub

N’hésitez pas à envoyer une demande de tirage (pull request) ou à envoyer des commentaires sur la page GitHub.

Voir aussi

  • PSReadLine est fortement influencé par la bibliothèque readline GNU.