我正在比较存储在变量中的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
答案 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
都是真的。课程:注意绑定顺序。如有疑问,请使用括号。