PowerShell条件判断存在符合对象却无结果输出问题排查
问题分析与代码修正
核心问题点
- 属性未正确获取:原
Get-MgGroup仅指定了Members属性,判断所需的SecurityEnabled、MailEnabled、GroupTypes未被请求,导致这些属性值为空,条件判断永远不成立。 - 条件判断错误:邮件启用安全组的
GroupTypes是空数组,原代码用-ne 'Unified'无法正确匹配,应该判断数组是否不包含Unified或为空。 - 成员属性获取不全:
Get-MgGroupMember默认返回属性有限,直接访问AdditionalProperties.displayName可能拿不到值,需要显式指定获取displayName属性。 - 冗余的
continue语句:循环末尾的continue属于多余代码,会强制跳过后续逻辑(虽不直接导致失败,但无意义)。 - 输出路径未校验:未确保
$OutputFolder变量已定义且对应目录存在,会导致导出失败。
修正后的代码
# 定义并确保输出目录存在,替换为你的实际路径 $OutputFolder = "C:\O365_Group_Output" if (-not (Test-Path -Path $OutputFolder)) { New-Item -Path $OutputFolder -ItemType Directory | Out-Null } # 获取所有组,并指定需要的核心属性 $Groups = Get-MgGroup -Property "DisplayName,SecurityEnabled,MailEnabled,GroupTypes" -All foreach($group in $Groups){ # 精准匹配邮件启用安全组的属性条件 if ($group.SecurityEnabled -and $group.MailEnabled -and ($group.GroupTypes -notcontains 'Unified')){ # 获取所有组成员,并显式请求displayName属性 $members = Get-MgGroupMember -GroupId $group.Id -Property "DisplayName" -All # 处理成员为空的情况,避免join操作报错 $memberNames = if ($members) { $members.DisplayName -join ";" } else { "" } [PSCustomObject]@{ 'Display Name' = $group.DisplayName 'Members' = $memberNames } | Export-Csv -path "$OutputFolder\MailEnabledSecurityGroups.csv" -Append -NoTypeInformation } }
关键修改说明
- 补充属性请求:
Get-MgGroup添加DisplayName,SecurityEnabled,MailEnabled,GroupTypes,确保判断所需属性能被正确读取。 - 修正条件判断:改用
$group.GroupTypes -notcontains 'Unified',精准匹配非统一组(邮件启用安全组的GroupTypes为空或不包含Unified)。 - 成员属性显式指定:
Get-MgGroupMember添加-Property "DisplayName"和-All,直接访问$members.DisplayName而非AdditionalProperties,结果更可靠。 - 空成员处理:增加判断逻辑,避免成员为空时
-join操作报错,输出空字符串占位。 - 输出目录校验:添加目录检查与创建逻辑,确保导出路径有效。
- 移除冗余代码:删除循环末尾的
continue,让foreach循环自然执行。
内容的提问来源于stack exchange,提问作者Alistair Trout
相关产品推荐
相关产品推荐

