2016-12-20 4 views
2

検証セットを作成するのは簡単です。あなたのPowerShellのバージョン>は2 enter image description herePowershellがValidationSetで自動完成

ある場合は、開始時のparamsに通過しない場合、それはそれほど有用ではないのですが

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

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

) 

無料の自動補完を提供します。

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  

今回全くタブ補完や手がかりがない:(

無効な何かを入力すると、あなたが有益なエラーを取得する実行します。

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

しかし、このエラーが最後にスローされます元の間違いの時ではなく、再試行するオプションはありません。

この検証を拡張して、ユーザーフレンドリーになる方法が見つかったことはありますかパラメータで渡されずに開始されたインスタンス

+1

があります。私がうまくいくことがわかっているのは、 'Read-Host'コマンドレットを使って自分でやることですが、私はそれをあなたに勧めません。あなたはおそらくそれと一緒に暮らすべきです。 –

答えて

2

あなたが望むものではないかもしれませんが、私はスクリプトに簡単に追加すると、あなたのパラメータにHelpMessagesを追加することになると思います。そのようにすれば、ユーザーは入力しようとしている内容についてより多くの情報を得ることができます。

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 

) 

ので、パラメータを指定せずに呼び出されたときに...

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

まさに@Matt私はこれを自分自身で追加しようとしていました。[HelpMessage Argument](https://technet.microsoft.com/en-us/library/dd347600.aspx)。それは私が望んでいたものではありませんが、ユーザーを盲目にするよりも優れています。ちょうど今動的パラメータを見に行きます。 –

0

私は私が望む結果を得ることができ、パラメータブロックの後に必須ビットを削除し、いくつかのコードを追加した場合。私はこれがパイピングなどのためにかなり役に立たないCmdletを作成するかもしれないことを理解しているので、なぜそれがデフォルトの動作ではないのか分かります。

私は、必須パラメータで実際の作業を行い、ユーザー入力を得るために別のヘルパー関数を持つための機能を持っています。

あなたが何でもしたいと思っていることを次のようにするには、それほど長い時間を要しません。

私はValidateSet拡張子を使用して、このへの道を知らない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."} 
      } 

}