PowerShell脚本检查AD组存在性仅返回最后一个对象求助
解决PowerShell脚本仅返回最后一个AD组的问题
我明白你遇到的困扰了——明明所有AD组都存在,但脚本只返回最后一个找到的对象。这是因为你在循环里的变量处理逻辑有问题,咱们来一步步修正:
问题根源
- 结果对象被重复覆盖:你在
foreach循环内部每次都重新创建$r对象,这就导致前一次循环的结果被后一次完全覆盖,最后返回自然只有最后一个组的信息。 - 多余的数组初始化:循环里的
$R_AD=@()完全没必要,每次循环都会清空这个数组,虽然不影响功能,但属于冗余代码。
修正后的脚本(基础版)
function CheckAD { # 提前初始化结果数组,用来存储所有找到的AD组对象 $results = @() $AD= "AA","BB" foreach ($group in $AD) { $foundGroup = Get-ADGroup -filter {GroupCategory -eq "Security" -and Name -eq $group} ` -SearchBase "OU=Application,OU=SOO,OU=Groups,OU=UN,DC=B3,DC=in" | Select-Object -ExpandProperty name -Unique if ($foundGroup) { # 创建新的自定义对象并追加到结果数组 $groupObj = New-Object -TypeName psobject $groupObj | Add-Member -MemberType NoteProperty -Name ADGroup -Value $foundGroup $results += $groupObj } } # 返回整个结果数组,包含所有找到的组 return $results } $Test=CheckAD
更简洁的优化版
PowerShell支持直接通过[PSCustomObject]创建自定义对象,而且可以利用循环自动收集结果的特性,简化代码:
function CheckAD { $AD= "AA","BB" # 直接将循环输出的对象收集为结果数组 $results = foreach ($group in $AD) { $foundGroup = Get-ADGroup -filter {GroupCategory -eq "Security" -and Name -eq $group} ` -SearchBase "OU=Application,OU=SOO,OU=Groups,OU=UN,DC=B3,DC=in" | Select-Object -ExpandProperty name -Unique if ($foundGroup) { [PSCustomObject]@{ ADGroup = $foundGroup } } } return $results } $Test=CheckAD
关键修改点说明
- 将结果存储容器(
$results)放在循环外部,确保每次循环的结果都被保留并追加。 - 用
$foundGroup直接判断是否找到组(PowerShell中非空对象会被视为$true),比判断count更简洁直观。 - 优化版利用PowerShell的循环特性,直接将循环内输出的对象收集为数组,省去手动追加的步骤,代码更高效易读。
内容的提问来源于stack exchange,提问作者jcaloy
相关产品推荐
相关产品推荐

