У кого-нибудь есть пример, показывающий, как переопределить функцию TabExpansion2 в Windows PowerShell 3.0? Я знаю, как переопределить старую функцию TabExpansion, но я хочу предоставить список элементов для IntelliSense в PowerShell ISE. Я посмотрел на определение TabExpansion2, и было нелегко понять, как я ввожу свой собственный код в процесс расширения вкладки.
Пример, показывающий, как переопределить TabExpansion2 в Windows PowerShell 3.0
Ответы (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
Вот пример переопределенного TabExpansion2
- TabExpansion2.ps1 и несколько используемых на практике профилей с дополнителями для этого:
- Invoke-Build.ArgumentCompleters.ps1 Завершители аргументов для Invoke-Build
- Mdbc.ArgumentCompleters.ps1 Завершители аргументов для Mdbc
- ArgumentCompleters.ps1 Завершители аргументов, ввода и результатов
Достопримечательности:
- TabExpansion2.ps1 выполняет минимальную работу при загрузке. Потенциально затратная инициализация выполняется один раз, когда действительно происходит завершение.
- Переопределенный
TabExpansion2
обеспечивает механизм расширения через один или несколько профилей*ArgumentCompleters.ps1
в пути. Профили вызываются один раз при первом вызовеTabExpansion2
. Несколько профилей могут поставляться с разными независимыми модулями, инструментами и т. д. и использоваться одновременно. - В дополнение к стандартным настраиваемым модулям завершения аргументов и встроенным модулям завершения аргументов этот пользовательский
TabExpansion2
поддерживает обработчики результатов, которые настраивают результаты встроенных процессоров завершения и ввода, которые могут перехватывать и заменять встроенное завершение. - В некоторых случаях он работает с пустыми встроенными результатами только для чтения.
- ArgumentCompleters.ps1 содержит пример процессора ввода заменяет встроенное завершение типов и пространств имен альтернативным, иногда более полезным.
- Другой завершающий компонент обеспечивает завершение комментариев: теги справки (.Synopsis, .Description и т. д.) и завершение закомментированного кода, почему бы и нет?