所以我正在编写一个powershell脚本,除其他事项外,检查您是否在Exchange分发组中,并在必要时添加您。
让它变得棘手的一件事是,脚本从一个"不可靠"的来源获取数据。也就是说,我甚至不能保证我有一个用户名来检查。
我需要检查是否为空字符串。我有我的用户名存储在一个变量$tempUserName
,这只是一个字符串,并存储在$DefaultMobileDL
分布列表的名称。由于其他原因,我不会讲,我不能做if {} else {}
语句,我只能做if语句。我知道这很愚蠢。
好的,这是我的代码:
if (-not [string]::IsNullOrEmpty($tempUsername)) {
$MembersOfDLDefault = Get-DistributionGroupMember "$DefaultMobileDL" -ResultSize Unlimited |
Select -Expand sAMAccountName |
Select-String -pattern "$tempUsername" -SimpleMatch -Quiet
}
if ([string]::IsNullOrEmpty($tempUsername)) { $MembersOfDLDefault = $false }
# bug testing...
Write-Host "username: `"$tempUsername`" , MembersOfDLDefault: `"$MembersOfDLDefault`""
if ($MembersOfDLDefault -eq $false) {
# User is not a member of $DefaultMobileDL, try adding them
# ... more code here ...
}
if ($MembersOfDLDefault -eq $true) {
# User is already a member of the $DefaultMobileDL
# ... again, more code ...
}
该代码块在foreach循环中,并且由于我在每次迭代后传递变量值时遇到问题,因此在代码的最后,我清除了几个变量,但对于此实例,重要的一行是:
Clear-Variable MembersOfDLDefault
现在,如果我正确阅读文档,如果找到项目,Select-String -Quiet
应该返回True,如果没有返回False。
然而,这不是我得到的结果。下面是当我运行代码时发生的事情(在这个运行中,我有3个用户名,我碰巧要测试,其中一个(第三个)是一个空字符串):
username: "smithj" , MembersOfDLDefault: ""
username: "doej" , MembersOfDLDefault: "True"
username: "" , MembersOfDLDefault: "False"
可以看到,第一次运行代码时,$MembersOfDLDefault
没有被设置为任何值!
我知道我错过了一些愚蠢的东西,但是我盯着这段代码看了太长时间了,需要一些新的人来看看。有什么我遗漏或忽视的吗?
提前感谢。
从技术上讲,我是在Exchange Management Shell中运行这个,而不是直接从Powershell中运行,尽管我认为这应该无关紧要
似乎文档中所说的-quiet
和它实际做的是不同的。行为似乎是,当没有匹配时,Select-String -quite
将返回$null
。要验证这一点,请尝试:
# ~> "xxxHELLOaaa" | Select-String "HELLO" -SimpleMatch -Quiet
True
# ~> "xxxHELLOaaa" | Select-String "HaLLO" -SimpleMatch -Quiet
要么实现不正确,要么文档不正确(我找不到任何确认)。一个简单的解决方法是将结果强制转换为布尔值:
if (-not [string]::IsNullOrEmpty($tempUsername)) {
$MembersOfDLDefault = [bool] (Get-DistributionGroupMember "$DefaultMobileDL" -ResultSize Unlimited |
Select -Expand sAMAccountName |
Select-String -pattern "$tempUsername" -SimpleMatch -Quiet )
}