我注意到了PowerShell中的一些奇怪的行为。我已经验证了我认为PowerShell 2和PowerShell 4中的错误行为。这真的是一个错误,还是我做错了?
请使用以下代码段。我们的想法是简单地遍历Active Directory组名称的列表(字符串数组),并告诉我每组中有多少成员:
Foreach($ADGroupName In [String[]]'Domain Admins', `
'Enterprise Admins', `
'Administrators', `
'Account Operators', `
'Backup Operators')
{
$Group = Get-ADGroup -Filter { Name -EQ $ADGroupName } -Properties Members
If ($Group -EQ $Null -OR $Group.PropertyNames -NotContains 'Members')
{
# This only happens on the first iteration of the loop!
Write-Error "$ADGroupName was null or was missing the Members property!"
}
Else
{
Write-Host "$ADGroupName contains $($Group.Members.Count) members."
}
}
在循环的第一次迭代中,我得到错误,因为$ Group是$ null,因此没有正确的成员,尽管命令和组名都有效且组有成员。通过循环的后续迭代工作正常。但是列表中的第一组是什么并不重要。我可以对组进行重新排序,但总是会在字符串数组的第一个元素上返回错误。
暂时解决这个问题,我只是简单地加入了一个' DummyGroup'作为数组的第一个元素,并优雅地处理预期的异常,然后列表中的每个其他组都可以正常工作。
有没有更好的方法来处理看似错误的内容?
答案 0 :(得分:3)
不知道你是否真的把它称为" bug"或不是,但它是由在脚本块过滤器中使用变量引起的。如果更改为使用带有可扩展字符串的字符串过滤器,则变量扩展将按预期工作:
Foreach($ADGroupName In [String[]]'Domain Admins', `
'Enterprise Admins', `
'Administrators', `
'Account Operators', `
'Backup Operators')
{
$Group = Get-ADGroup -Filter "Name -EQ '$ADGroupName'" -Properties Members
If ($Group -EQ $Null -OR $Group.PropertyNames -NotContains 'Members')
{
# This only happens on the first iteration of the loop!
Write-Error "$ADGroupName was null or was missing the Members property!"
}
Else
{
Write-Host "$ADGroupName contains $($Group.Members.Count) members."
}
}
答案 1 :(得分:1)
由于mjolinor修正了这个错误;为了练习PowerShell的乐趣,我重写了一下,删除了错误检查错误。
@()
创建组名称数组,而无需反引号行继续。Get-ADGroup $ADGroupName -Properties Members
e.g。
$ADGroupNames = @('Domain Admins',
'Enterprise Admins',
'Administrators',
'Account Operators',
'Backup Operators')
$ADGroups = $ADGroupNames | Get-ADGroup -Properties Members
$ADGroups | ForEach { write "$($_.Name) contains $($_.Members.Count) members" }