验证用户输入 - 它是一个整数并且在一定范围内

Validating user input - that it is an integer and in a certain range

我有以下代码可以检查用户的输入是否为整数,但我如何扩展它以确保它在 1 到 4 的范围内?

    $a = 0
$inputOK = $false
do
{
  try
  {
    $a = Read-Host "Please enter the number between 1 and 4"
    if (([int]$a) -and (1..4 -contains $a)) {
    $inputOK = $true}
  }
  catch
  {
    Write-Host -ForegroundColor red "INVALID INPUT!  Please enter a numeric value."
  } 

}
until ($inputOK)
Write-Host –ForegroundColor green "You have entered $a"

您可以使用范围和 -contains 运算符:

1..4 -contains $a

或者您可以使用 2 个条件来完成:

($a -ge 1) -and ($a -le 4)

-ge 是 "greater than or equal to" 而 -le 是 "less than or equal to"

如果您正在编写函数,而不是编写自定义块来验证您的输入,您可以使用内置的参数验证。这里有一个 technet article 详细描述。在 ISE 中,您可以按 Ctrl+J 和 select advanced-function complete 来自动创建示例。这是一个简化版本。

function Test-ParameterValidation
{
[OutputType([String])]
Param
(
    # Param1 help description
    [Parameter(Mandatory=$true, 
               ValueFromPipeline=$true)]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [ValidateCount(1,5)]
        [ValidateSet("sun", "moon", "earth")]
        [Alias("p1")] 
        $Param1,

        [AllowNull()]
        [AllowEmptyCollection()]
        [AllowEmptyString()]
        [ValidateScript({$true})]
        [ValidateRange(0,5)]
        [int]
        $Param2,

        [ValidatePattern("^\d{5}(?:[-\s]\d{4})?$")]
        [ValidateLength(5,10)]
        [String]
        $Param3
    )
    process{
    "p1 is $Param1"
    "p2 is $Param2"
    "p3 is $Param3"

    }
}

和示例 inputs/outputs。

C:\ > Test-ParameterValidation -Param1 earth,moon
p1 is earth moon
p2 is 0
p3 is 

C:\ > Test-ParameterValidation -Param1 earth,moon,moon,moon,moon,moon
Test-ParameterValidation : Cannot validate argument on parameter 'Param1'. The number of supplied arguments (6) exceeds the maximum number of allowed arguments (5). Specify less than 5 arguments and then try the command again.
At line:1 char:34
+ Test-ParameterValidation -Param1 earth,moon,moon,moon,moon,moon
+                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Test-ParameterValidation], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Test-ParameterValidation


C:\ > Test-ParameterValidation -Param1 earth,moon,moon,moon -Param2 5 -Param3 ABC
Test-ParameterValidation : Cannot validate argument on parameter 'Param3'. The number of characters (3) in the argument is too small. Specify an argument whose length is greater than or equal to "5" and then try the command again.
At line:1 char:73
+ Test-ParameterValidation -Param1 earth,moon,moon,moon -Param2 5 -Param3 ABC
+                                                                         ~~~
    + CategoryInfo          : InvalidData: (:) [Test-ParameterValidation], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Test-ParameterValidation


C:\ > Test-ParameterValidation -Param1 earth,moon,moon,moon -Param2 5 -Param3 ABCDEF
Test-ParameterValidation : Cannot validate argument on parameter 'Param3'. The argument "ABCDEF" does not match the "^\d{5}(?:[-\s]\d{4})?$" pattern. Supply an argument that matches "^\d{5}(?:[-\s]\d{4})?$" and try the command again.
At line:1 char:73
+ Test-ParameterValidation -Param1 earth,moon,moon,moon -Param2 5 -Param3 ABCDEF
+                                                                         ~~~~~~
    + CategoryInfo          : InvalidData: (:) [Test-ParameterValidation], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Test-ParameterValidation


C:\ > Test-ParameterValidation -Param1 earth,moon,moon,moon -Param2 5 -Param3 11111-1111
p1 is earth moon moon moon
p2 is 5
p3 is 11111-1111

C:\ > Test-ParameterValidation -Param1 earth,moon,moon,moon -Param2 6
Test-ParameterValidation : Cannot validate argument on parameter 'Param2'. The 6 argument is greater than the maximum allowed range of 5. Supply an argument that is less than or equal to 5 and then try the command again.
At line:1 char:63
+ Test-ParameterValidation -Param1 earth,moon,moon,moon -Param2 6
+                                                               ~
    + CategoryInfo          : InvalidData: (:) [Test-ParameterValidation], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Test-ParameterValidation

这些使您能够以标准 "powershelly" 方式显示验证错误,而无需编写任何额外的内容。如果您需要一些繁重的验证,您可以使用 ValidateScript() 属性。