这是PowerShell中的错误吗?
我注意到PowerShell中有一些奇怪的行为。我已经在PowerShell 2和PowerShell 4中验证了我认为是错误的行为。这真的是一个bug还是我做错了什么 以下面的片段为例。其思想是简单地遍历组名列表(字符串数组),并告诉我每个组中有多少成员:这是PowerShell中的错误吗?,powershell,Powershell,我注意到PowerShell中有一些奇怪的行为。我已经在PowerShell 2和PowerShell 4中验证了我认为是错误的行为。这真的是一个bug还是我做错了什么 以下面的片段为例。其思想是简单地遍历组名列表(字符串数组),并告诉我每个组中有多少成员: Foreach($ADGroupName In [String[]]'Domain Admins', ` 'Enterprise Admins', `
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”作为数组的第一个元素,并优雅地处理预期的异常,然后列表中的其他所有组都可以正常工作
有没有更好的方法来处理看似是bug的问题?不知道您是否真的会将其称为“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."
}
}
不知道您是否真的将其称为“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."
}
}
当mjolinor修正了错误时;为了练习PowerShell的乐趣,我重写了一点,删除了错误检查
- 您可以使用
生成组名数组,而不需要反勾线继续@()
- 您可以调用
,而无需过滤器Get ADGroup$ADGroupName-Properties Members
- 或者,您可以通过管道将阵列馈送到Get-ADGroup,并在一次操作中返回多个组
当mjolinor修正了错误时;为了练习PowerShell的乐趣,我重写了一点,删除了错误检查
- 您可以使用
生成组名数组,而不需要反勾线继续@()
- 您可以调用
,而无需过滤器Get ADGroup$ADGroupName-Properties Members
- 或者,您可以通过管道将阵列馈送到Get-ADGroup,并在一次操作中返回多个组
吸取教训,谢谢。有时很难记住何时使用脚本块以及何时使用字符串,尤其是在AD cmdlet中。看起来不同的cmdlet处理它们的方式不同,您只需记住它们的特性。如果他们不希望我使用ScriptBlock,那么他们应该将其标记为语法错误。>_吸取教训,谢谢。有时很难记住何时使用脚本块以及何时使用字符串,尤其是在AD cmdlet中。看起来不同的cmdlet处理它们的方式不同,您只需记住它们的特性。如果他们不希望我使用ScriptBlock,那么他们应该将其标记为语法错误。>_