powershell字符串比较错误

时间:2014-10-15 10:56:07

标签: validation powershell operators

我正在比较存储在变量中的2个字符串,并根据几个条件验证它们。请参阅下面的代码:

do
    {
    Write-Host -ForegroundColor 'Yellow' "Enter Users Password `nMust be 8 or more characters long and contain a UPPER case character and a Digit."
    $Password = Read-Host "First time" -AsSecureString
    $Passcheck = Read-Host "And again" -AsSecureString

    $PassConvertFirst = [System.Runtime.InteropServices.Marshal]::SecureStringtoBSTR($Password) ; $PlainPass1 = [system.Runtime.InteropServices.Marshal]::PtrToStringAuto($passconvertfirst)
    $PassConvertSecond = [System.Runtime.InteropServices.Marshal]::SecureStringtoBSTR($Passcheck) ; $PlainPass2 = [system.Runtime.InteropServices.Marshal]::PtrToStringAuto($Passconvertsecond)

    if ($PlainPass1 -Contains $PlainPass2 -and $PlainPass1.Length -ge 8 -or $PlainPass2.Length -ge 8)
    {
        $PassCheckBreak = $false
        $PlainPassword = $PlainPass2
    }
    else
    {
        Write-Warning "Passwords don't match, Try again.."
        $PassCheckBreak = $true

    }
}
while ($PassCheckBreak)

当我尝试比较这个时,99.99%的时间我遇到了一个奇怪的错误:

使用P4ssword的P4ssw0rd

使用上面的代码验证为true!这没有任何意义,好像我尝试验证

W0rd with word

验证失败。

我尝试过更换为比较运算符,但我仍然遇到同样的问题。

有什么想法或想法吗?

非常感谢, Nigel Tatschner

1 个答案:

答案 0 :(得分:0)

问题出在if声明中。

让我们仔细看看:

$PlainPass1 -Contains $PlainPass2 -and $PlainPass1.Length -ge 8 -or $PlainPass2.Length -ge 8

评估每个比较:

$PlainPass1 -Contains $PlainPass2 # False
$PlainPass1.Length -ge 8 # True
$PlainPass2.Length -ge 8 #true

结果是:

$false -and $true -or $true

任何-or $true都是真的。课程:注意绑定顺序。如有疑问,请使用括号。