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
また、このリリースでは、 az
、 gcloud
、および 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 ページで pull request を送信するか、フィードバックを送信してください。
参照
- PSReadLine は GNU readline ライブラリの影響を大きく受けます。
PowerShell