2016-09-01 5 views
1
комментарий

Shay Леви в POWERSHELL SCRIPTING WITH [VALIDATESET] предполагают, что украшения параметра PowerShell с ValidateSet() должно привести к вкладке доработок:ValidateSet() украшение не создает автодополнению

Один из benfits использования ValidateSet (или Enum типы) в PowerShell 3.0 заключается в том, что вы получаете расширение вкладки в значениях ValidateSet/Enum.

Я не могу заставить это работать в функции PowerShell или C# Cmdlet.

Функция:

function Get-LogonToken { 

    [CmdletBinding()] 
    param(

     [Parameter(Position = 0, Mandatory = $true)] 
     [ValidateNotNullOrEmpty()] 
     [string] $ServerName, 

     [Parameter(Position = 1, Mandatory = $true)] 
     [ValidateSet("secEnterprise", "secLDAP", "secWinAD")] 
     [string] $Authentication, 

     [Parameter(Position = 2, Mandatory = $true)] 
     [ValidateNotNullOrEmpty()] 
     [string] $Username, 

     [Parameter(Position = 3, Mandatory = $true)] 
     [ValidateNotNullOrEmpty()] 
     [SecureString] $Password 

    ) 

    Write-Verbose "ServerName: $ServerName" 
    Write-Verbose "Authentication: $Authentication" 
    Write-Verbose "Username: $Username" 
    Write-Verbose "Password: $(ConvertFrom-SecureString $Password)" 

    ... 
} 

Cmdlet:

[System.Management.Automation.Cmdlet(System.Management.Automation.VerbsCommon.Get, "LogonToken")] 
    [OutputType(typeof(System.String))] 
    public class GetLogonToken : System.Management.Automation.Cmdlet 
    { 

     [System.Management.Automation.Parameter(Position = 0, Mandatory = true)] 
     [ValidateNotNullOrEmpty] 
     public string ServerName 
     { 
      get { return server; } 
      set { server = value; } 
     } 
     private string server; 

     [System.Management.Automation.Parameter(Position = 1, Mandatory = true)] 
     [ValidateSet("secEnterprise", "secLDAP", "secWinAD")] 
     public string Authentication 
     { 
      get { return authentication; } 
      set { authentication = value; } 
     } 
     private string authentication; 

     [System.Management.Automation.Parameter(Position = 2, Mandatory = true)] 
     [ValidateNotNullOrEmpty] 
     public string Username 
     { 
      get { return username; } 
      set { username = value; } 
     } 
     private string username; 

     [System.Management.Automation.Parameter(Position = 3, Mandatory = true)] 
     [ValidateNotNullOrEmpty] 
     public SecureString Password 
     { 
      get { return password; } 
      set { password = value; } 
     } 
     private SecureString password; 

    ... 

} 

PowerShell:

PS> get-logontoken -verbose 

cmdlet Get-LogonToken at command pipeline position 1 
Supply values for the following parameters: 
ServerName: server 
Authentication: sec<tab> (nothing generated) 

Что мне не хватает?

ответ

1

Спасибо за сообщение как отдельный вопрос craig. Теперь я вижу, в чем проблема.

Вы не можете выполнить вкладки, когда PowerShell запрашивает отсутствующий Mandatory значения (во время выполнения), только тогда, когда вы первый печатали командлет:

Get-LogonToken -Authentication secTAB

+0

Verified. Нехороший UX, ИМХО. – craig

+0

@craig, возможно, нет, но подсказка - скорее нечто вроде «oops you forget something» (хотя я отстаивал это как способ замены приглашений «Read-Host», когда намерение одинаковое). По большей части, это просто не используется, что часто. Возможно, для него может быть улучшена функция, в которой вы можете проголосовать (не уверен, что MS по-прежнему использует Connect для этого или что). Я также хотел бы увидеть вкладку в этих подсказках. – briantist