将函数结果存储到动态变量中

时间:2017-09-06 15:54:05

标签: .net powershell active-directory

我正在处理AD嵌套组并需要一些帮助。

以下是代码:

function Extract-Users($group, $array) {
    $members = Get-ADGroupMember -Identity $group.Name
    foreach ($member in $members) {
        if ($member.objectClass -eq "user") {
            $Admin = New-Object PSObject
            $Admin | Add-Member -Type NoteProperty -Name User -Value $user.Name
            $Admin | Add-Member -Type NoteProperty -Name Group -Value $group.Name
            $array += $Admin
            Remove-Variable Admin
            return $array
        } elseif ($member.objectClass -eq "group"){
            Extract-Users $member, $object
        }
    }
}

问题在于我希望能够像这样调用函数:

$ADGroups = Get-ADGroup -Filter {Name -like "*admin*"}
$Admins = @()
foreach ($group in $ADGroups) {
    Extract-Users $group $Admins
}

将函数中创建的所有对象存储到我抛入函数的变量中。这样我提取的所有用户都存储在$ Admins数组中。我知道我可以把它全部写成手册,但我想知道是否有一种动态的方法。

谢谢你们

1 个答案:

答案 0 :(得分:1)

我不相信可以使用存储在变量中的动态函数,但我相信你可以使用byref参数获得所需的结果。

简单示例

$Users = @()

function Extract-Users{
Param([Parameter(Mandatory=$true)]$group,
  [Parameter(Mandatory=$true)][ref]$array)

$array.Value += (Get-Random)
return $array.Value.count 
}

这样,使用了Extract-Users $数组参数,并将该函数执行的操作添加到传递的现有数组中。

您可以将返回值用于任何其他目的或完全忽略它。

简单演示

在这里,我的extract-users实际上使用$ array参数并为其添加一个随机数。但是,您可以添加用户。

cls

$group = 'something'
Write-host 'Users count:' (Extract-Users $group  ([ref]$Users))

Write-Host '$Users variable content'
$Users | ft 


Write-host 'Users count:' (Extract-Users $group  ([ref]$Users))
Write-host 'Users count:' (Extract-Users $group  ([ref]$Users))
Write-host 'Users count:' (Extract-Users $group  ([ref]$Users))

Write-Host ([Environment]::NewLine)
Write-Host 'Here is the $Users variable content'
$Users | ft

需要注意的重点是你需要传递参数([ref] $ MyParam)而不仅仅是$ MyParam,而且在函数中,你想要更新.value属性而不是变量本身。

编辑: 好吧,正如Rohin在OP问题中指出的那样,看似简单

$FinalArray += Extract-Users $group $Admins

完美地完成这个伎俩。

如果您需要返回值不同(例如获取布尔结果成功/错误状态或获取用户或其他任何内容的数量,[ref]将非常适合t