为PowerShell中的交换机添加自动完整功能

时间:2016-12-27 16:36:00

标签: powershell

我正在尝试在PowerShell中添加自动完成功能。在这种情况下,我希望能够在我的控制台中键入“test”。之后,能够使用TAB扩展键入Get-Se [TAB]以自动完成Get-Search。

PS > Get-Se[TAB]
PS > Get-Search

function test
{
    [CmdletBinding()]
    param()

    # label the while loop "outer"
    :outer while($true){
        $x = Read-Host

        # split $x into two parts
        $first,$second = $x -split '\s',2

        # switch evaluating the first part
        switch($first){
            Get-Search {
                 # Searching
            }
            default {
                Write-Host "False"
            }
        }
    }
}

其他信息:

目标: 我希望能够使用看起来像cmdlet的参数来感受Powershell。

关于原始剧本:

我创建了一个脚本来自动化来自多个API的查询,适用于许多不同的用户。我现在用于搜索的是“s”,我希望它是“Get-Search”所​​以Read-Host等待输入,用户输入“Get-Search'value'”并且格式化的JSON返回

PS > Get-Search foobar
#Returns JSON

1 个答案:

答案 0 :(得分:2)

起初我很难理解你的意图,但我想我现在就明白了。

您希望在Read-Host提示符内实现标签页完成(标签扩展)。

不幸的是,没有办法做到这一点。

如果你想要分享为什么,可能有更好的方法来实现你的最终目标。

根据您的其他信息,我有不同的方法。

  1. 为每个查询创建实际功能,例如Get-Search等。您甚至可以为它们添加别名,以便s可以直接对应。
  2. 将所有这些功能包装在适当的模块中,以便您可以导入它们(请参阅下一步)。
  3. Create a constrained runspace只允许用户执行您想要的特定功能和别名(这对于模块来说更容易,但模块不是必需的。)
  4. 这可以让您的最终用户访问(甚至远程)PowerShell会话,该会话只能使用您已创建并允许执行的功能。其他cmdlet /函数甚至语言功能(如使用变量)都将受到限制且不可用。

    通过这种方式,您可以获得真正的PowerShell选项卡扩展和语义,并最终获得一组以自动方式使用的真实函数。

    您不必编写任何提示或解析。

    此外,会话可以受到保护,只允许特定用户和组连接到它。