Пример, показывающий, как переопределить TabExpansion2 в Windows PowerShell 3.0

У кого-нибудь есть пример, показывающий, как переопределить функцию TabExpansion2 в Windows PowerShell 3.0? Я знаю, как переопределить старую функцию TabExpansion, но я хочу предоставить список элементов для IntelliSense в PowerShell ISE. Я посмотрел на определение TabExpansion2, и было нелегко понять, как я ввожу свой собственный код в процесс расширения вкладки.


person Michael Kelley    schedule 05.09.2012    source источник


Ответы (2)


Я думаю, что этот пример должен стать хорошей отправной точкой: Поваренная книга Windows Powershell: пример реализации TabExpansion2. Пример кода показывает, что вы можете добавить код как до, так и после вызовов по умолчанию [CommandCompletion]::CompleteInput.

Например, вы можете добавить запись в хеш-таблицу $options с именем CustomArgumentCompleters, чтобы получить настраиваемое завершение для аргументов команды. Запись должна быть хэш-таблицей, где ключи — это имена аргументов (например, «ComputerName» или «Get-ChildItem:Filter»), а значения — это массивы значений, которые можно использовать для завершения этого параметра. На Powertheshell.com также есть статья об этом: Динамическое завершение аргумента. Вы также можете указать пользовательские завершения для собственных исполняемых файлов, используя параметр NativeArgumentCompleters (опять же, ключи — это имена команд, а значения — массивы возможных дополнений).

Когда CompleteInput вернется, вы можете сохранить результат в $result для дальнейшего анализа. Результатом является экземпляр CommandCompletion класс. Если завершение по умолчанию не нашло совпадений, вы можете добавить свой собственный CompletionResult в список совпадений:

$result.CompletionMatches.Add(
   (New-Object Management.Automation.CompletionResult "my completion string") )

Не забудьте вернуть $result из функции, чтобы действительно произошло завершение.

Наконец, примечание об устранении неполадок: код, который вызывает TabCompletion2, кажется, подавляет весь вывод на консоль (что неудивительно), поэтому, если вы хотите написать отладочные сообщения для себя, вы можете попробовать записать их в отдельный текстовый файл. Например, вы можете изменить функцию End в TabCopmletion2, чтобы она выглядела так:

$result = [System.Management.Automation.CommandCompletion]::CompleteInput(
    $inputScript, $cursorColumn, $options)
$result | Get-Member | Add-Content "c:\TabCompletionLog.txt"
$result
person Charlie    schedule 10.11.2012
comment
Это где-то официально задокументировано? Как эта информация изначально просочилась? - person Trevor Sullivan; 22.04.2013
comment
К сожалению, я не видел никакой официальной документации, но я хотел бы увидеть ее, если она существует. - person Charlie; 22.04.2013

Вот пример переопределенного TabExpansion2 - TabExpansion2.ps1 и несколько используемых на практике профилей с дополнителями для этого:

Достопримечательности:

  • TabExpansion2.ps1 выполняет минимальную работу при загрузке. Потенциально затратная инициализация выполняется один раз, когда действительно происходит завершение.
  • Переопределенный TabExpansion2 обеспечивает механизм расширения через один или несколько профилей *ArgumentCompleters.ps1 в пути. Профили вызываются один раз при первом вызове TabExpansion2. Несколько профилей могут поставляться с разными независимыми модулями, инструментами и т. д. и использоваться одновременно.
  • В дополнение к стандартным настраиваемым модулям завершения аргументов и встроенным модулям завершения аргументов этот пользовательский TabExpansion2 поддерживает обработчики результатов, которые настраивают результаты встроенных процессоров завершения и ввода, которые могут перехватывать и заменять встроенное завершение.
  • В некоторых случаях он работает с пустыми встроенными результатами только для чтения.
  • ArgumentCompleters.ps1 содержит пример процессора ввода заменяет встроенное завершение типов и пространств имен альтернативным, иногда более полезным.
  • Другой завершающий компонент обеспечивает завершение комментариев: теги справки (.Synopsis, .Description и т. д.) и завершение закомментированного кода, почему бы и нет?
person Roman Kuzmin    schedule 06.12.2013