about_PSReadLine

Kort beskrivning

PSReadLine ger en förbättrad kommandoradsredigering i PowerShell-konsolen.

Det har gjorts många uppdateringar av PSReadLine sedan den version som levereras i Windows PowerShell 5.1.

  • v2.3.5 levereras först i PowerShell 7.4.2 och 7.5.0-preview.3
  • v2.3.4 levereras först i PowerShell 7.4.0-rc.1
  • v2.2.6 levereras först i PowerShell 7.3.0
  • v2.1.0 levereras först i PowerShell 7.2.5
  • v2.0.4 levereras först i PowerShell 7.0.11
  • v2.0.0 levereras i Windows PowerShell 5.1

Mer information om versionsskillnader finns i about_PSReadLine_Release_Notes.

Lång beskrivning

Den aktuella versionen av PSReadLine kan installeras och användas i Windows PowerShell 5.1 och senare. För vissa funktioner måste du köra PowerShell 7.2 eller senare.

PSReadLine ger en kraftfull kommandoradsredigeringsupplevelse för PowerShell-konsolen. Den ger:

  • Syntaxfärgning för kommandoraden
  • En visuell indikation på syntaxfel
  • En bättre flerradsupplevelse (både redigering och historik)
  • Anpassningsbara nyckelbindningar
  • Cmd- och Emacs-lägen
  • Många konfigurationsalternativ
  • Slutförande av Bash-format (valfritt i cmd-läge, standard i Emacs-läge)
  • Emacs yank/kill-ring
  • PowerShell-tokenbaserad "ord"-förflyttning och borttagning
  • Förutsägande IntelliSense
  • Dynamisk visning av hjälp i konsolen utan att förlora din plats på kommandoraden

PSReadLine kräver PowerShell 5.1 eller senare. PSReadLine fungerar med standardvärden för Windows-konsolen, Windows-terminal och Visual Studio Code. Det fungerar inte i Windows PowerShell ISE.

PSReadLine kan installeras från PowerShell-galleriet. Om du vill installera PSReadLine i en version av PowerShell som stöds kör du följande kommando.

Install-Module -Name PSReadLine -AllowClobber -Force

Kommentar

Från och med PowerShell 7.0 hoppar PowerShell över automatisk inläsning av PSReadLine i Windows om ett skärmläsarprogram identifieras. PsReadLine fungerar för närvarande inte bra med skärmläsarna. Standardåtergivningen och formateringen av PowerShell 7.0 i Windows fungerar korrekt. Du kan läsa in modulen manuellt om det behövs.

Förutsägande IntelliSense

Predictive IntelliSense är ett tillägg till begreppet tabbavslut som hjälper användaren att slutföra kommandon. Det gör det möjligt för användare att identifiera, redigera och köra fullständiga kommandon baserat på matchande förutsägelser från användarens historik och ytterligare domänspecifika plugin-program.

Aktivera Predictive IntelliSense

Predictive IntelliSense är inaktiverat som standard. Om du vill aktivera förutsägelser kör du bara följande kommando:

Set-PSReadLineOption -PredictionSource History

Parametern PredictionSource kan också acceptera plugin-program för domänspecifika och anpassade krav.

Om du vill inaktivera Predictive IntelliSense kör du bara:

Set-PSReadLineOption -PredictionSource None

Bindningar för anpassad nyckel

PSReadLine stöder anpassade nyckelbindningar med hjälp av cmdleten Set-PSReadLineKeyHandler . De flesta anpassade nyckelbindningar anropar en av de bindbara funktionerna, till exempel

Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward

Du kan binda en ScriptBlock till en nyckel. ScriptBlock kan göra i stort sett vad du vill. Några användbara exempel är

  • redigera kommandoraden
  • öppna ett nytt fönster (till exempel hjälp)
  • ändra kataloger utan att ändra kommandoraden

ScriptBlock tar emot två argument:

  • $key - Ett [ConsoleKeyInfo]- objekt som är nyckeln som utlöste den anpassade bindningen. Om du binder samma ScriptBlock till flera nycklar och behöver utföra olika åtgärder beroende på nyckeln kan du kontrollera $key. Många anpassade bindningar ignorerar det här argumentet.

  • $arg - Ett godtyckligt argument. Oftast är detta ett heltalsargument som användaren skickar från nyckelbindningarna DigitArgument. Om din bindning inte accepterar argument är det rimligt att ignorera det här argumentet.

Nu ska vi ta en titt på ett exempel som lägger till en kommandorad i historiken utan att köra den. Det här är användbart när du inser att du har glömt att göra något, men inte vill ange kommandoraden igen som du redan har angett.

$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

Du kan se många fler exempel i filen SamplePSReadLineProfile.ps1, som är installerad i mappen PSReadLine-modulen .

De flesta nyckelbindningar använder vissa hjälpfunktioner för att redigera kommandoraden. Dessa API:er dokumenteras i about_PSReadLine_Functions.

Kommentar

Kommandohistorik

PSReadLine har en historikfil som innehåller alla kommandon och data som du har angett från kommandoraden. Historikfilerna är en fil med namnet $($host.Name)_history.txt. I Windows-system lagras historikfilen på $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine. I andra system än Windows lagras historikfilerna på $env:XDG_DATA_HOME/powershell/PSReadLine eller $env:HOME/.local/share/powershell/PSReadLine.

Historiken kan innehålla känsliga data, inklusive lösenord. PSReadLine försöker filtrera bort känslig information. Alla kommandorader som innehåller följande strängar skrivs inte till historikfilen.

  • password
  • asplaintext
  • token
  • apikey
  • secret

PSReadLine 2.2.0 förbättrar filtreringen av känsliga data

  • Använder PowerShell Abstract Syntax Tree (AST) på den tolkade kommandoraden för att söka efter känsliga data.
  • Använder en lista över säkra cmdletar från SecretManagement-modulen för att tillåta att dessa kommandon läggs till i historiken. Listan över tillåtna innehåller:
    • Get-Secret
    • Get-SecretInfo
    • Get-SecretVault
    • Register-SecretVault
    • Remove-Secret
    • Set-SecretInfo
    • Set-SecretVaultDefault
    • Test-SecretVault
    • Unlock-SecretVault
    • Unregister-SecretVault

Följande kommandon kan till exempel skrivas till historikfilen:

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

Följande kommandon skrivs inte till historikfilen:

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

Om det finns andra kommandon som du inte vill skriva till historikfilerna kan du använda parametern AddToHistoryHandler för cmdleten Set-PSReadLineOption . Ett exempel på hur du använder AddToHistoryHandler finns i Exempel 7 på Set-PSReadLineOption.

PSReadLine 2.3.4 förbättrar filtreringen av känsliga data

Förbättrade standardrensningen för känslig historik för att tillåta att historiken innehåller säker egenskapsåtkomst.

När den känsliga strängen ingår i en egenskapsåtkomst:

  • Om den här medlemsåtkomståtgärden inte ingår i en tilldelning anser vi att den är säker
  • Annars, om den högra sidan är en pipeline eller en variabel, anser vi också att den är säker

Följande användningsfall anses till exempel vara säkra och kan sparas i historiken.

$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

Versionen förbättrade också rensningen av känslig historik så att token kunde hämtas med hjälp av kommandoradsverktygen az, gcloudoch kubectl .

Följande användningsfall anses till exempel vara säkra och kan sparas i historiken.

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

Feedback och bidrag till PSReadLine

PSReadLine på GitHub

Skicka gärna en pull-begäran eller skicka feedback på GitHub-sidan.

Se även