次の方法で共有


about_PSReadLine

簡単な説明

PSReadLine は、PowerShell コンソールでのコマンド ライン編集エクスペリエンスの向上を提供します。

Windows PowerShell 5.1 に付属するバージョン以降、PSReadLine には多くの更新プログラムが適用されています。

  • 最初に PowerShell 7.4.2 および 7.5.0-preview.3 で出荷された v2.3.5
  • v2.3.4 は PowerShell 7.4.0-rc.1 で最初に出荷されました
  • v2.2.6 は PowerShell 7.3.0 で最初に出荷されました
  • v2.1.0 が PowerShell 7.2.5 で最初に出荷されました
  • v2.0.4 は PowerShell 7.0.11 で最初に出荷されました
  • v2.0.0 は Windows PowerShell 5.1 に付属しています

バージョンの違いの詳細については、 about_PSReadLine_Release_Notesを参照してください。

長い説明

現在のバージョンの PSReadLine は、Windows PowerShell 5.1 以降にインストールして使用できます。 一部の機能では、PowerShell 7.2 以降を実行している必要があります。

PSReadLine は、PowerShell コンソール用の強力なコマンド ライン編集エクスペリエンスを提供します。 次の機能を提供します。

  • コマンド ラインの構文の色分け
  • 構文エラーの視覚的な表示
  • より優れたマルチライン エクスペリエンス (編集と履歴の両方)
  • カスタマイズ可能なキー バインド
  • Cmd モードと Emacs モード
  • 多くの構成オプション
  • Bash スタイルの入力候補 (Cmd モードでは省略可能、Emacs モードでは既定)
  • Emacs yank/kill-ring
  • PowerShell トークンベースの "単語" の移動と削除

PSReadLine には PowerShell 5.1 以降が必要です。 PSReadLine は、既定の Windows コンソール ホスト、Windows ターミナル、Visual Studio Code で動作します。 Windows PowerShell ISE では機能しません。

PSReadLine は、PowerShell ギャラリーからインストールできます。 サポートされているバージョンの PowerShell に PSReadLine をインストールするには、次のコマンドを実行します。

Install-Module -Name PSReadLine -AllowClobber -Force

カスタム キー バインド

PSReadLine では、 Set-PSReadLineKeyHandler コマンドレットを使用したカスタム キー バインドがサポートされています。 ほとんどのカスタム キー バインドは、 バインド可能な関数のいずれかを呼び出します。たとえば、

Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward

ScriptBlock をキーにバインドできます。 ScriptBlock は、必要な操作をほとんどすべて実行できます。 便利な例をいくつか挙げます。

  • コマンド ラインを編集する
  • 新しいウィンドウを開く (ヘルプなど)
  • コマンド ラインを変更せずにディレクトリを変更する

ScriptBlock は 2 つの引数を受け取ります。

  • $key - [ConsoleKeyInfo] カスタム バインドをトリガーしたキーであるオブジェクト。 同じ ScriptBlock を複数のキーにバインドし、キーに応じて異なるアクションを実行する必要がある場合は、 $key確認できます。 多くのカスタム バインドでは、この引数は無視されます。

  • $arg - 任意の引数。 ほとんどの場合、これは、ユーザーがキー バインド DigitArgument から渡す整数引数です。 バインドが引数を受け入れない場合は、この引数を無視するのが妥当です。

コマンド ラインを実行せずに履歴に追加する例を見てみましょう。 これは、何かを忘れたが、既に入力したコマンド ラインを再入力したくない場合に便利です。

$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

PSReadLine モジュール フォルダーにインストールされているファイル SamplePSReadLineProfile.ps1には、さらに多くの例が表示されます。

ほとんどのキー バインドでは、コマンド ラインを編集するためにいくつかのヘルパー関数が使用されます。 これらの API については、 about_PSReadLine_Functionsに記載されています。

メモ

コマンド履歴

PSReadLine は、コマンド ラインから入力したすべてのコマンドとデータを含む履歴ファイルを保持します。 履歴ファイルは、 $($host.Name)_history.txtという名前のファイルです。 Windows システムでは、履歴ファイルは $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLineに格納されます。

履歴には、パスワードを含む機密データを含めることができます。 PSReadLine は機密情報のフィルター処理を試みます。 次の文字列を含むコマンド ラインは履歴ファイルに書き込まれません。

  • password
  • asplaintext
  • token
  • apikey
  • secret

PSReadLine 2.2.0 では、機密データのフィルター処理が向上します

  • 解析されたコマンド ラインの PowerShell 抽象構文ツリー (AST) を使用して、機密データを検索します。
  • SecretManagement モジュールの安全なコマンドレットの許可リストを使用して、これらのコマンドを履歴に追加できるようにします。 許可リストには次のものが含まれます。
    • Get-Secret
    • Get-SecretInfo
    • Get-SecretVault
    • Register-SecretVault
    • Remove-Secret
    • Set-SecretInfo
    • Set-SecretVaultDefault
    • Test-SecretVault
    • Unlock-SecretVault
    • Unregister-SecretVault

たとえば、次のコマンドを履歴ファイルに書き込むことが許可されています。

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

次のコマンドは履歴ファイルに書き込まれません。

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

履歴ファイルに書き込まない他のコマンドがある場合は、Set-PSReadLineOption コマンドレットの AddToHistoryHandler パラメーターを使用できます。 AddToHistoryHandler の使用方法の例については、Set-PSReadLineOption の例 7 を参照してください。

PSReadLine 2.3.4 では、機密データのフィルター処理が向上します

履歴に安全なプロパティ アクセスを含めることができるように、既定の機密履歴スクラブが改善されました。

機密性の高い文字列がプロパティ アクセスの一部である場合:

  • このメンバー アクセス操作が割り当ての一部でない場合は、安全であると見なされます
  • それ以外の場合、右側がパイプラインまたは変数である場合は、安全であるとも見なされます

たとえば、次のユース ケースは安全と見なされ、履歴に保存できます。

$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

また、このリリースでは、 azgcloud、および kubectl コマンドライン ツールを使用してトークンを取得できるように、機密性の高い履歴スクラブが改善されました。

たとえば、次のユース ケースは安全と見なされ、履歴に保存できます。

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

PSReadLine に関するフィードバックと投稿

GitHub の PSReadLine

GitHub ページで pull request を送信するか、フィードバックを送信してください。

参照

  • PSReadLine は GNU readline ライブラリの影響を大きく受けます。