17

有没有人展示如何在 Windows PowerShell 3.0 中覆盖 TabExpansion2 函数的示例?我知道如何覆盖旧的 TabExpansion 函数,但我想为 PowerShell ISE 中的智能感知提供项目列表。我查看了 TabExpansion2 的定义,很难理解如何在选项卡扩展过程中注入自己的代码。

4

2 回答 2

15

我认为这个例子应该给你一个很好的起点:Windows Powershell Cookbook: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
于 2012-11-10T21:33:34.753 回答
12

这是一个被覆盖的示例TabExpansion2- TabExpansion2.ps1 和几个在实践中使用的配置文件,并为其完成了:

兴趣点:

  • TabExpansion2.ps1在加载时做最少的工作。当真正完成时执行一次潜在的昂贵初始化。
  • Overridden通过路径中的TabExpansion2一个或多个配置文件提供扩展机制。*ArgumentCompleters.ps1配置文件在第一次调用 时调用一次TabExpansion2。多个配置文件可能带有不同的独立模块、工具等并同时使用。
  • 除了标准的自定义参数完成器和本机参数完成器之外,此自定义 TabExpansion2支持结果处理器,它调整来自内置完成的结果和输入处理器,可以拦截和替换内置完成。
  • 在某些情况下,它可以解决只读空的内置结果。
  • ArgumentCompleters.ps1 包含一个输入处理器的示例,该示例将类型和命名空间的内置完成替换为有时更有用的替代方法。
  • 另一个完成者在注释中提供完成:帮助标签(.Synopsis.Description等)和注释掉的代码的完成,为什么不呢?
于 2013-12-06T04:06:12.523 回答