如果语句 -match 或 -包含未返回正确的条件



我们正在更新电子邮件地址的SIP,我们将使用PowerShell脚本来监视AD何时更新,然后更新本地计算机。

我到了在@符号处拆分电子邮件地址的部分,我正在查看@符号的左侧。

例:

FirstName.LastName@someplace.com

我可以在我刚刚得到的地方正确拆分它

名字.姓氏

但是当我去检查条件是否包含.时,我无法得到正确的 true 假。

例:

$sipaddress = "FirstName.LastName@someplace.com"
$splitname = $sipaddress.Split("@")[0]
# at this point, $splitname varible will contain "FirstName.LastName"
if ($splitname -match '.') {
  Write-Host "TRUE"
} else {
  Write-Host "False"
}
# this returns TRUE which is perfect

但是,如果我将变量更改为像这样进行测试

$sipaddress = "FirstNameLastName@someplace.com"

$splitname变量将包含 FirstNameLastName ,当不正确时,它仍然返回 TRUE。 它应该返回 false,因为没有.

我做错了什么? 我试图在if语句中使用-contains但这也不起作用。

有没有办法尝试检查.-match

-match运算符执行正则表达式匹配,因此匹配.将匹配除换行符以外的任何字符,而不仅仅是点。如果要匹配文字点,则需要对其进行转义(.)或进行不同类型的比较,例如与-like运算符(-like '*.*')的通配符匹配或使用字符串对象的Contains()方法。

-contains运算符检查数组是否包含特定元素。为了能够使用该运算符,您需要将字符串转换为字符数组:

[char[]]$splitname -contains '.'

不过,我不建议这样做。其他方法更方便。

修改后的代码:

$sipaddress = "FirstName.LastName@someplace.com"
$localpart, $domain = $sipaddress -split '@'
if ($localpart.Contains('.')) {
  Write-Host 'True'
} else {
  Write-Host 'False'
}

最新更新