Есть ли у кого-нибудь пример, показывающий, как переопределить функцию TabExpansion2 в Windows PowerShell 3.0? Я знаю, как переопределить старую функцию TabExpansion, но я хочу предоставить список элементов для intellisense в PowerShell ISE. Я посмотрел на определение TabExpansion2, и было нелегко понять, как я ввожу свой собственный код в процесс расширения вкладок.
Пример, показывающий, как переопределить TabExpansion2 в Windows PowerShell 3.0
Ответ 1
Я думаю, что этот пример должен дать вам хорошую отправную точку: Windows Powershell Cookbook: пример внедрения TabExpansion2. Код примера показывает, что вы можете добавить код как до, так и после вызовов по умолчанию на [CommandCompletion]::CompleteInput
.
Например, вы можете добавить запись в хэш-таблицу $options
с именем CustomArgumentCompleters для получения пользовательского завершения для аргументов команды. Запись должна быть хэш-таблицей, где ключи являются именами аргументов (например, "Имя_компьютера" или "Get-ChildItem: Фильтр" ), а значения представляют собой массивы значений, которые могут быть использованы для завершения этого параметра. У 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
Ответ 2
Вот пример переопределенного 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, .Описание и т.д.) И завершение прокомментированного кода, почему бы и нет?