所以我正在编写一个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命令行管理程序运行它,而不是直接从Powershell运行它,尽管我认为这不重要
答案 0 :(得分:3)
这似乎是文档中关于-quiet
所说的内容,它实际上是different。行为似乎是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 )
}