有没有人展示如何在 Windows PowerShell 3.0 中覆盖 TabExpansion2 函数的示例?我知道如何覆盖旧的 TabExpansion 函数,但我想为 PowerShell ISE 中的智能感知提供项目列表。我查看了 TabExpansion2 的定义,很难理解如何在选项卡扩展过程中注入自己的代码。
2 回答
我认为这个例子应该给你一个很好的起点: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
这是一个被覆盖的示例TabExpansion2
-
TabExpansion2.ps1
和几个在实践中使用的配置文件,并为其完成了:
- Invoke-Build.ArgumentCompleters.ps1 Invoke-Build的 参数完成器
- Mdbc.ArgumentCompleters.ps1 Mdbc的 参数完成器
- ArgumentCompleters.ps1 参数、输入和结果完成器
兴趣点:
- TabExpansion2.ps1在加载时做最少的工作。当真正完成时执行一次潜在的昂贵初始化。
- Overridden通过路径中的
TabExpansion2
一个或多个配置文件提供扩展机制。*ArgumentCompleters.ps1
配置文件在第一次调用 时调用一次TabExpansion2
。多个配置文件可能带有不同的独立模块、工具等并同时使用。 - 除了标准的自定义参数完成器和本机参数完成器之外,此自定义
TabExpansion2
支持结果处理器,它调整来自内置完成的结果和输入处理器,可以拦截和替换内置完成。 - 在某些情况下,它可以解决只读空的内置结果。
- ArgumentCompleters.ps1 包含一个输入处理器的示例,该示例将类型和命名空间的内置完成替换为有时更有用的替代方法。
- 另一个完成者在注释中提供完成:帮助标签(.Synopsis、 .Description等)和注释掉的代码的完成,为什么不呢?