2016-12-27 26 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返回。 –