次の方法で共有


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 トークンベースの "単語" の移動と削除
  • 予測 IntelliSense
  • コマンド ラインで場所を失うことなく、コンソールにヘルプを動的に表示する

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

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

Install-Module -Name PSReadLine -AllowClobber -Force

Note

PowerShell 7.0 以降では、スクリーン リーダー プログラムが検出された場合、PowerShell は Windows での PSReadLine の自動読み込みをスキップします。 現在、PSReadLine はスクリーン リーダーではうまく機能しません。 Windows 上の PowerShell 7.0 の既定のレンダリングと書式設定は正しく機能します。 必要に応じて、モジュールを手動で読み込むことができます。

予測 IntelliSense

予測 IntelliSense は、ユーザーがコマンドを正常に完了するのに役立つタブ補完の概念に追加されています。 これにより、ユーザーは、ユーザーの履歴と追加のドメイン固有のプラグインからの一致する予測に基づいて、完全なコマンドを検出、編集、実行できます。

予測 IntelliSense を有効にする

予測 IntelliSense は既定では無効になっています。 予測を有効にするには、次のコマンドを実行します。

Set-PSReadLineOption -PredictionSource History

PredictionSource パラメーターは、ドメイン固有およびカスタム要件のプラグインを受け入れることもできます。

予測 IntelliSense を無効にするには、次のコマンドを実行します。

Set-PSReadLineOption -PredictionSource None

カスタム キー バインド

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に格納されます。 Windows 以外のシステムでは、履歴ファイルは $env:XDG_DATA_HOME/powershell/PSReadLine または $env:HOME/.local/share/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 ライブラリの影響を大きく受けます。