2016-12-27 67 views
2

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

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'值'”,格式化的JSON返回。

PS > Get-Search foobar 
#Returns JSON 
+0

Poweshell已经有自动完成?如果我输入'Get-Se [TAB]',它会循环执行'Get-SecureBootPolicy,Get-SecureBootUEFI,Get-Service'请参阅'gcm Get-Se *'要让交换机对您确切的参数做出反应,通配符或-regex选项'get-help about_switch -show' – LotPings

回答

2

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

您想要在Read-Host提示符内执行制表符填充(制表符扩展)。

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

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


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

  1. 为每个查询创建实际的功能,如Get-Search,等你甚至可以添加别名他们,使s直接对应,如果你想。
  2. 将所有这些函数包装在适当的模块中,以便您可以导入它们(请参阅下一步)。
  3. Create a constrained runspace只允许用户执行所需的特定功能和别名(这对模块来说更容易,但模块不是必需的)。

这可以做的是让最终用户访问(甚至远程)PowerShell会话,该会话只能使用您创建并允许执行的功能。其他cmdlet /函数,甚至像使用变量的语言功能都将受到限制并且不可用。

通过这种方式,您可以获得真正的PowerShell选项卡扩展和语义,并且最终还可以实现一系列以自动方式使用的真实功能。

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

此外,会话可以是安全的,只允许特定的用户和组连接到它。

+0

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

+2

@Badlarry最终目标是什么?如果您使用'Read-Host',那么我认为它是针对最终用户的? – briantist

+0

是的,这是正确的,我已经创建了一个脚本来自动化多个API的查询,对于许多不同的用户。我现在搜索的东西是“s”,我希望它是“Get-Search”,所以Read-Host等待输入,用户输入“s”值'“,然后格式化的JSON返回。 –