这是PowerShell中的错误吗?

时间:2014-03-26 17:50:13

标签: powershell

我注意到了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'作为数组的第一个元素,并优雅地处理预期的异常,然后列表中的每个其他组都可以正常工作。

有没有更好的方法来处理看似错误的内容?

2 个答案:

答案 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
  • 或者您可以通过管道将数组提供给Get-ADGroup,并在一次操作中返回多个组

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" }