Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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 и несколько использованных на практике профилей с дополнениями для него:

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

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