如果语句-match或-contains没有返回正确的条件

时间:2016-01-26 14:55:33

标签: powershell if-statement match conditional-statements statements

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

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

示例:

FirstName.LastName@someplace.com

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

FirstName.LastName

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

示例:

$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,因为没有.

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

有没有办法尝试检查-match的{​​{1}}?

1 个答案:

答案 0 :(得分:3)

-match operator匹配regular expression,因此匹配.将匹配除换行符之外的任何字符,而不仅仅是点。如果要匹配文字点,则需要将其转义(\.)或进行其他类型的比较,例如与-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'
}