【问题标题】:Example showing how to override TabExpansion2 in Windows PowerShell 3.0显示如何在 Windows PowerShell 3.0 中覆盖 TabExpansion2 的示例
【发布时间】:2012-09-05 23:41:21
【问题描述】:

有没有人提供一个示例来说明如何在 Windows PowerShell 3.0 中覆盖 TabExpansion2 函数?我知道如何覆盖旧的 TabExpansion 函数,但我想为 PowerShell ISE 中的智能感知提供项目列表。看了TabExpansion2的定义,不明白怎么在tab扩展过程中注入自己的代码。

【问题讨论】:

    标签: powershell windows-8 powershell-3.0 tabexpansion


    【解决方案1】:

    我认为这个例子应该给你一个很好的起点:Windows Powershell Cookbook: Sample implementation of TabExpansion2。示例代码显示您可以在默认调用 [CommandCompletion]::CompleteInput 之前和之后添加代码。

    例如,您可以向名为 CustomArgumentCompleters 的 $options 哈希表添加一个条目,以获取命令参数的自定义完成。该条目应该是一个哈希表,其中键是参数名称(例如“ComputerName”或“Get-ChildItem:Filter”),值是可用于完成该参数的值数组。 Powertheshell.com 也有一篇关于此的文章:Dynamic Argument Completion。您还可以使用 NativeArgumentCompleters 选项为本机可执行文件指定自定义完成(同样,键是命令名称,值是可能完成的数组)。

    一旦CompleteInput 返回,您可以将结果存储在$result 中以供进一步分析。结果是CommandCompletion 类的一个实例。如果默认补全未找到任何匹配项,您可以将自己的 CompletionResult 条目添加到匹配项列表中:

    $result.CompletionMatches.Add(
       (New-Object Management.Automation.CompletionResult "my completion string") )
    

    不要忘记从函数中返回$result,这样才能真正完成。

    最后,关于故障排除的说明:调用TabCompletion2 的代码似乎压制了所有基于控制台的输出(不足为奇),因此如果您想自己编写调试消息,可以尝试将它们写入单独的文本文件。例如,您可以将TabCopmletion2 中的End 函数更改为如下所示:

    $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 包含一个输入处理器的例子,它取代了内置的 用另一种更有用的替代方法完成类型和命名空间 有时。
    • 另一个完成器在 cmets 中提供完成:帮助标签 (.Synopsis, .Description 等)和完成注释掉的代码,为什么不呢?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多