2016-12-20 2 views
2

ein Validierungs-Set erstellen ist recht einfach.Powershell Auto-Complete auf ValidationSet

param(
[Parameter(Mandatory=$true)] 
[ValidateSet('Ding','Dong')] 
[string]$bellState, 

[Parameter(Mandatory=$true)] 
[ValidateSet('Dead','Alive')] 
[string]$witchesState 

) 

Es bietet kostenlose Auto-Vervollständigung, wenn Ihre Powershell-Version> 2 enter image description here

aber es ist nicht so hilfreich, wenn Sie in dem params am Anfang nicht passieren.

cmdlet Untitled2.ps1 at command pipeline position 1 
Supply values for the following parameters: 
bellState: Dib 
witchesState: Alive 
C:\Users\cac\Untitled2.ps1 : Cannot validate argument on parameter 'bellState'. The argument "Dib" does not belong to the set "Ding,Dong" specified by the ValidateSet attribute. Supply an argument that is in the set and then 
try the command again. 
+ CategoryInfo   : InvalidData: (:) [Untitled2.ps1],  ParentContainsErrorRecordException 
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Untitled2.ps1  

diese Zeit kein Abschluss Tab oder Hinweise :(

Wenn Sie in etwas ungültig Sie geben eine nützliche Fehlermeldung erhalten tun: am Ende

"The argument "Dib" does not belong to the set "Ding,Dong"" 

jedoch dieser Fehler ausgelöst wird, der Params nicht zum Zeitpunkt des ursprünglichen Fehlers und es gibt keine Möglichkeit, es erneut zu versuchen.

Hat jemand einen Weg gefunden, diese Validierung zu erweitern, um noch benutzerfreundlicher zu sein die initiierte Instanz ohne übergebene Parameter.

+1

Ich weiß nicht, einen Weg, um dies eine ValidateSet Erweiterung. Das einzige, was ich weiß, was funktionieren würde, ist, das 'Read-Host'-Cmdlet zu verwenden und es selbst zu tun, aber ich würde es dir nicht empfehlen. Du solltest wahrscheinlich damit leben. –

Antwort

2

Es ist zwar nicht genau sein könnte, was man wollte ich denke, würde eine einfache Addition an das Skript HelpMessages auf Ihre Parameter hinzuzufügen wäre. Auf diese Weise hat der Benutzer die Möglichkeit, mehr Informationen darüber zu erhalten, was er gerade schreiben wird.

param(
[Parameter(Mandatory=$true, 
    HelpMessage="You need to pick ding or dong silly")] 
[ValidateSet('Ding','Dong')] 
[string]$bellState, 

[Parameter(Mandatory=$true)] 
[ValidateSet('Dead','Alive')] 
[string]$witchesState 

) 

Wenn also ohne Angabe von Parametern aufgerufen ...

Supply values for the following parameters: 
(Type !? for Help.) 
bellState: !? 
You need to pick ding or dong silly 
bellState: 
+0

Genau @Matt Ich war gerade dabei, das selbst hinzuzufügen siehe: [HelpMessage Argument] (https://technet.microsoft.com/en-us/library/dd347600.aspx). Es ist nicht genau das, was ich wollte, aber es ist besser, als den Benutzer blind zu lassen. Sehen Sie sich jetzt Dynamische Parameter an. –

0

Wenn ich die obligatorische Bit entfernen und einige Codes nach Parameterblock hinzufügen, kann ich das Ergebnis, das ich will bekommen. Ich verstehe, dass dies ein ziemlich nutzloses Cmdlet für Piping usw. machen könnte, also sehe ich, warum es kein Standardverhalten ist.

ich bin, dies zu umgehen, indem Sie eine Funktion, die die eigentliche Arbeit mit verbindlichen params zu tun und eine separate Hilfsfunktion, die eine Benutzereingabe zu erhalten.

Es ist nicht so langatmig oder schwierig zu bekommen die ziemlich viel zu tun folgenden, was Sie wollen.

Es gibt eine article here

if(!($bellState)){ 
     $title = "Pick a Bell State" 
     $message = "You need to pick ding or dong silly" 

     $Ding = New-Object System.Management.Automation.Host.ChoiceDescription "Ding", ` 
      "First Strike." 

     $Dong = New-Object System.Management.Automation.Host.ChoiceDescription "Dong", ` 
      "Second Strike." 

     $options = [System.Management.Automation.Host.ChoiceDescription[]]($Ding, $Dong) 

     $result = $host.ui.PromptForChoice($title, $message, $options, 0) 

     switch ($result) 
      { 
       0 { $type = "Ding" ; "First Strike."} 
       1 { $type = "Dong" ; "Second Strike."} 
      } 

}