验证集上的Powershell自动完成

时间:2016-12-20 12:32:58

标签: validation powershell user-interface

创建验证集非常简单。

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

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

)

如果您的Powershell版本> 2,则提供免费自动完成功能 enter image description here

然而,如果你在开始时没有传递参数,那就没那么有用了。

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""

然而,这个错误是在游戏结束时抛出的,而不是在原始错误的时候,并且没有选择再试一次。

有没有人找到一种方法来扩展此验证,使其在未启动参数的情况下在其启动的实例中更加用户友好。

2 个答案:

答案 0 :(得分: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

)

答案 1 :(得分:0)

如果我删除强制位并在参数块之后添加一些代码,我可以得到我想要的结果。我明白这可能会成为一个非常无用的Cmdlet用于管道等等所以我明白为什么它不是默认行为。

我通过使用强制参数执行实际工作以及使用单独的辅助函数来获取用户输入来解决这个问题。

让所有人完成任何你想做的事情并不是那么长时间的啰嗦或狡猾。

有一个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."}
            }

 }