如何使Validate-set也适用于强制参数输入提示?

时间:2017-01-25 08:50:58

标签: powershell

我为我的函数使用动态验证集来强制参数。

未提供时,Powershell会提示并强制用户输入。

但是在这种情况下,TAB没有响应,我必须输入值。

有没有办法让动态验证设置在提示符下可用?

2 个答案:

答案 0 :(得分:3)

你可以做什么!

原因是主机应用程序提供给您的提示没有可用于循环显示有效值的必要信息。

要了解原因,必须准确了解在调用cmdlet时未将参数传递给Mandatory参数时会发生什么。让我们探索吧!

首先,让我们定义一个简单的样本函数:

function Test-ValidateSet {
  param(
    [Parameter(Mandatory)]
    [ValidateSet('a','b','c')]
    [string[]]$Character
  )

  Write-Host "You entered: $Character!"
}

如果您想要在输入时查看PowerShell 的内容,请使用Trace-Command

PS C:\> Trace-Command ParameterBinding {Test-ValidateSet} -PSHost
DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Test-ValidateSet]
DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Test-ValidateSet]
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Test-ValidateSet]
DEBUG: ParameterBinding Information: 0 :     PROMPTING for missing mandatory parameters using the host
cmdlet Test-ValidateSet at command pipeline position 1
Supply values for the following parameters:
Character[0]:

必须从调用提示符的位置发出这些DEBUG消息。通过PowerShell GitHub仓库搜索"使用主机"提示缺少必需参数。会带领你to this call site

由于您可以解密,Prompt() method只需要3件事:

  1. 标题([string]
  2. 消息([string]
  3. 一组描述([System.Management.Automation.Host.FieldDescription[]]
  4. 查看FieldDescription对象的属性,您会发现它们大致对应于[Parameter]属性 - 没有其他类型的属性 - 这基本上就是为什么你无法根据验证属性完成值。

答案 1 :(得分:0)

您只能在ValidateSet上使用制表符 如果使用Show-Command,则可以看到相同的行为 唯一的预运行验证是ValidateSet

试试这个:

Function Test-Function
{
    Param
    (
        [String]$NormalParameter,
        [ValidateSet('T1','T2','T3')]
        [String]$ValidateSetParameter,
        [ValidatePattern("[T4]|[T5]|[T6]")]
        [String]$ValidatePatternParameter,
        [ValidateScript({$_ -In ('T7','T8','T9')})]
        [String]$ValidateScriptParameter,
        [ValidateRange('A','C')]
        [String]$ValidateRangeParameter
    )   
}

Show-Command Test-Function