Поделиться через


about_PSReadLine

Краткое описание

PSReadLine предоставляет улучшенный интерфейс редактирования командной строки в консоли PowerShell.

Было много обновлений PSReadLine с версии, которая поставляется в Windows PowerShell 5.1.

  • версия 2.3.5, впервые отправленная в PowerShell 7.4.2 и 7.5.0-preview.3
  • Версия 2.3.4 впервые отправлена в PowerShell 7.4.0-rc.1
  • Версия 2.2.6, впервые отправленная в PowerShell 7.3.0
  • Версия 2.1.0, впервые отправленная в PowerShell 7.2.5
  • Версия 2.0.4 впервые отправлена в PowerShell 7.0.11
  • Версия 2.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.

PSReadLine можно установить из коллекция PowerShell. Чтобы установить PSReadLine в поддерживаемой версии PowerShell, выполните следующую команду.

Install-Module -Name PSReadLine -AllowClobber -Force

Примечание.

Начиная с PowerShell 7.0, PowerShell пропускает автоматическую загрузку PSReadLine в Windows, если обнаружена программа чтения с экрана. В настоящее время PSReadLine не работает хорошо с средствами чтения с экрана. Отрисовка и форматирование PowerShell 7.0 по умолчанию в Windows работает правильно. При необходимости модуль можно загрузить вручную.

Прогнозирование IntelliSense

Прогнозная функция IntelliSense — это дополнение к концепции завершения вкладки, которая помогает пользователю успешно выполнять команды. Он позволяет пользователям обнаруживать, изменять и выполнять полные команды на основе сопоставления прогнозов из журнала пользователя и дополнительных подключаемых модулей для конкретного домена.

Включение прогнозного IntelliSense

По умолчанию прогнозная технология IntelliSense отключена. Чтобы включить прогнозы, выполните следующую команду:

Set-PSReadLineOption -PredictionSource History

Параметр PredictionSource также может принимать подключаемые модули для конкретных доменных и пользовательских требований.

Чтобы отключить Predictive IntelliSense, просто выполните следующую команду:

Set-PSReadLineOption -PredictionSource None

Пользовательские привязки ключей

PSReadLine поддерживает пользовательские привязки ключей с помощью командлета Set-PSReadLineKeyHandler . Большинство пользовательских привязок ключей вызывают одну из привязываемых функций, например

Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward

Вы можете привязать ScriptBlock к ключу. ScriptBlock может сделать практически все, что вы хотите. Ниже приведены некоторые полезные примеры.

  • изменение командной строки
  • открытие нового окна (например, справка)
  • изменение каталогов без изменения командной строки

ScriptBlock получает два аргумента:

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

В файле SamplePSReadLineProfile.ps1можно увидеть много примеров, установленных в папке модуля PSReadLine .

Большинство ключевых привязок используют некоторые вспомогательные функции для редактирования командной строки. Эти 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.

Если есть другие команды, которые вы не хотите записать в файлы журнала, можно использовать параметр AddToHistoryHandler командлета Set-PSReadLineOption . Пример использования AddToHistoryHandler см. в примере 7 из Set-PSReadLineOption.

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

PSReadLine на GitHub

Вы можете отправить запрос на вытягивание или отправить отзыв на странице GitHub.

См. также

  • PSReadLine сильно влияет на библиотеку строк чтения GNU.