具有多个范围的 Powershell 整数参数验证

标签 powershell

我知道你可以声明一个整数参数,它只接受特定范围内的值:

[Parameter()][ValidateRange(1024,66535)]$Port

是否可以验证多个范围的参数输入?例如,假设我想允许端口输入为 1 到 80、135 到 445 以及 1024 到 65535,我可以这样做:

[Parameter()][ValidateRange(1,66535)]$Port

if ((($Port -gt 80) -and ($Port -lt 135)) -or (($Port -gt 445) -and ($Port -lt 1024))) {
    
    Write-Error "Incorrect input, please enter a value between 1-80, 135-445, or 1024-65535"
    break

}

然而,这并不是一种特别巧妙的做事方式。 ValidateSet() 也不能采用 1024..65535 这样的数字范围。有人对多个整数范围的输入验证有更好的想法吗?

最佳答案

您绝对可以实现您的自定义 ValidateRange attribute declaration通过创建 class继承自 ValidateEnumeratedArgumentsAttribute Class .这是一个小例子:

class ValidateCustomRange : Management.Automation.ValidateEnumeratedArgumentsAttribute {
    [void] ValidateElement([object] $Element) {
        if($Element -gt 80 -and $Element -lt 135 -or $Element -gt 445 -and $Element -lt 1024) {
            throw [Management.Automation.MetadataException]::new(
                'Invalid range! Must be ...your call here :)'
            )
        }
    }
}

function Test-Range {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [ValidateCustomRange()]
        [int] $Port
    )
}

Test-Range 80 # All good!
Test-Range 81 # Error

关于具有多个范围的 Powershell 整数参数验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73656850/

相关文章:

sql - 我如何在 azure for DTU 上自动运行此脚本

powershell - 通过 Powershell 从 Azure RM 作业获取作业输入参数

powershell - 在 PowerShell 中,如何将列表映射到搜索字符串

c# - 调用 powershell 时抛出的异常为 "Security error"

powershell - 无法使用Get-MessageTrackingLog作为Sender@domain.com.CSV导出外部电子邮件收件人的列表?

powershell - 通过 Azure Powershell 设置 Azure 网站的主机名

powershell - New-SelfSignedCertificate -CertStoreLocation 找不到路径

PowerShell 的嵌套数据类型输出

powershell - 如何读取、转换、输出文件夹中的所有文件?

powershell - 如何组合字符串输入并动态生成数组?