PowerShell中的ValidatePattern:值不匹配

时间:2017-08-02 16:38:57

标签: powershell

我想对输入的字符串值执行模式验证,然后只有匹配时才继续使用该脚本,但感觉我在这里遗漏了一些内容:

Function Test-ValidatePattern {

[CmdletBinding()]
param (
    [Parameter(Mandatory)]
    [ValidatePattern(".co.uk|.com")]
    [System.String]$DomainName
)
    $DomainValid = "1"
    Write-Output "$DomainName is a valid domain name format"
}

#Sets forwarding email address, checks what it's set to and outputs this to logfile.
If ($EmailForwarding) {
    $ForwardDomain = Read-Host "What domain do you want to forward to? e.g. contoso.com`n"
    Test-ValidatePattern -DomainName $ForwardDomain
    While (!($DomainValid -eq "1")) {
        Write-Host "$ForwardDomain isn't a valid domain. Try again"
        $ForwardDomain = Read-Host "What domain do you want to forward to? e.g. contoso.com`n"
        }
}

当输入一个没有.co.uk或.com扩展名的字符串时,它会按预期返回一个错误,当输入一个但没有出现错误而不是显示该域名有效的消息时它会报错循环回到while块消息,而不是继续使用脚本的其余部分。

我已经尝试了-eq,-notmatch,-notlike但仍未按预期工作。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

我不明白为什么您认为在ValidatePattern属性的目的时需要编写验证脚本。这是一个示例函数:

function sample {
  param(
    [Parameter(Mandatory=$true)]
    [ValidatePattern('(\.co\.uk|\.com)$')]
    [String] $DomainName
  )
  "Your domain name is $DomainName"
}

如果你跑

sample foo.bar

PowerShell将抛出ParameterBindingValidationException异常,因为您作为$DomainName参数传递的字符串与模式不匹配。但是,如果你运行

sample foo.com

您将看到预期的输出:

Your domain name is foo.com

答案 1 :(得分:1)

您未将$DomainValid设置为任何值。函数的范围在完成后清除$DomainValid。您需要从Test-ValidatePattern函数返回一个值。例如:

Function Test-ValidatePattern {

[CmdletBinding()]
param (
    [Parameter(Mandatory)]
    [ValidatePattern(".co.uk|.com")]
    [System.String]$DomainName
)
    #$DomainValid = "1"
    Write-Output "$DomainName is a valid domain name format"
    return 1
}

#Sets forwarding email address, checks what it's set to and outputs this to logfile.
If ($EmailForwarding) {
    $ForwardDomain = Read-Host "What domain do you want to forward to? e.g. contoso.com`n"
    $DomainValid = Test-ValidatePattern -DomainName $ForwardDomain
    While (!($DomainValid -eq "1")) {
        Write-Host "$ForwardDomain isn't a valid domain. Try again"
        $ForwardDomain = Read-Host "What domain do you want to forward to? e.g. contoso.com`n"
        }
}

答案 2 :(得分:0)

我觉得在解释我追求的是什么时,我错过了一些事情。我只是想确保输入有一个点,所以无法输入单个单词,例如允许“foo.bar”,但“foo”不允许。如果不存在,则应再次提示用户。没有什么太严格,也没有阻止无效的条目,但更多的是为了捕捉懒惰的输入。

在稍微修补一下后,下面似乎做了我需要的事情。

cloud_sql_instances: 'shopnroar-175407:us-central1:snr-instance1'