参数验证

在 PowerShell 中,有多种方法可以验证参数输入。

如果传递无效值,这些 ParameterAttributes 将抛出,而不是在函数或脚本中编写代码来验证参数值。

ValidateSet

有时我们需要限制参数可以接受的可能值。假设我们只想在脚本或函数中为 $Color 参数仅允许红色,绿色和蓝色。

我们可以使用 ValidateSet 参数属性来限制它。它具有在设置此参数时允许选项卡完成的额外好处(在某些环境中)。

param(
    [ValidateSet('red','green','blue',IgnoreCase)]
    [string]$Color
)

你还可以指定 IgnoreCase 以禁用区分大小写。

ValidateRange

这种参数验证方法采用最小和最大 Int32 值,并要求参数在该范围内。

param(
    [ValidateRange(0,120)]
    [Int]$Age
)

ValidatePattern

此参数验证方法接受与指定的正则表达式模式匹配的参数。

param(
    [ValidatePattern("\w{4-6}\d{2}")]
    [string]$UserName
)

ValidateLength

这种参数验证方法测试传递的字符串的长度。

param(
    [ValidateLength(0,15)]
    [String]$PhoneNumber
)

ValidateCount

这种参数验证方法测试传入的参数数量,例如,字符串数组。

param(
    [ValidateCount(1,5)]
    [String[]]$ComputerName
)

ValidateScript

最后,ValidateScript 方法非常灵活,使用一个 scriptblock 并使用$ _来表示它,以表示传递的参数。然后,如果结果为$ true(包括任何输出为有效),则传递参数。

这可用于测试文件是否存在:

param(
    [ValidateScript({Test-Path $_})]
    [IO.FileInfo]$Path 
)

要检查 AD 中是否存在用户:

param(
    [ValidateScript({Get-ADUser $_})]
    [String]$UserName
)

几乎任何你能写的东西(因为它不仅限于 oneliners):

param(
    [ValidateScript({
        $AnHourAgo = (Get-Date).AddHours(-1)
        if ($_ -lt $AnHourAgo.AddMinutes(5) -and $_ -gt $AnHourAgo.AddMinutes(-5)) {
            $true
        } else {
            throw "That's not within five minutes. Try again."
        }
    })]
    [String]$TimeAboutAnHourAgo
)