将成员添加到通讯组 DL

Add Members to Distribution Groups DLs

我有以下 .csv 输入文件。这些是通讯组。 Level-4 是 Level3 的成员, Level-3 是 Level2 的成员, Level-2 是 Level1 的成员, Level-1 是 Level0 的成员。

到目前为止,我已经尝试了下面的代码。开始将 Level-4 添加到 Level-3 中。我已经标记了它们以便更好地理解。但是,我无法 select 对象并使用 PowerShell 以正确的方式迭代。

例如第 3 级 DL 的第一个实例是 'DL_L3_US1',它将包含来自第 4 级的成员,即 DL_L4_US1 和 DL_L4_US2。我该怎么做?

$DLlist = Import-Csv C:\tempfile\Book2.csv

$Test = $DLlist | select Level3,Level4 | ? {$_.level3 -notlike $null }

foreach ($x in $DLlist)

{Add-DistributionGroupMember -Identity "$($x.Level3)" -Member "$($x.Level4)"}

所以我的第一个答案是不正确的。我误解了这个问题。这是一个新示例:

$Props     = 'Level-0','Level-1','Level-2','Level-3','Level-4'
$GroupDefs = Import-Csv C:\temp\Book2.csv

For( $i = 0; $i -lt $GroupDefs.Count; ++$i )
{   # Loop through the objects that came from the CSV file...
    For( $p = 1; $p -lt $Props.Count; ++$p )
    {   # Loop through the known properties...
        $Prop      = $Props[$p]   # Convenience var
        $GroupProp = $Props[$p-1] # Convenience var

        If( $GroupDefs[$i].$Prop ) {
            # If the property is populated then loop backwards from $i-1, 
            # the group def record just prior to the current one.
            
            $Member = $GroupDefs[$i].$Prop
            :Inner For($r = ($i-1); $r -ge 0; --$r)
            {
                If( $GroupDefs[$r].$GroupProp ) {
                    # This means you hit the first record behind your current
                    # position that has the previous property populated.  Now 
                    # we know the group...
                    
                    $Group = $GroupDefs[$r].$GroupProp
                    Add-DistributionGroupMember -Identity $Group -Member $Member -WhatIf
                    Break Inner
                }            
            }
        }
    }
}

通过使用传统的For循环,我们可以找到其他位置的值。因此,我解决这个问题的方法是将已知属性的循环嵌套在组定义的循环中。当我找到一个有值的 属性 时,我会从 $GroupDefs 中的当前位置向后循环,直到找到前一个 属性 。到那时,我已经设法找到组和成员,所以我可以 运行 命令。

评论更新:

此程序中没有点源。使用点参考。如前所述,. 是一个运算符,因为在引用 属性 之前会计算右侧,因此我们可以使用变量或表达式。

假设您正在逐行查看电子表格。即$GroupDefs的外循环。您可以查看 $i 的值,就好像它是行#.

现在,对于这些行中的每一行,我想查看一组已知的 属性 名称中的每一个。所以我们要遍历 $Props。如果其中一个属性有一个值,那么我想查看前面的行以找到最近的前一行,其中填充了前面的 属性 ($Prop[$p-1])。例如,如果第 3 行填充了 Level-2,我知道我必须回顾第 2、1、0 行才能找到 属性 Level-1 的第一个先前值。那部分是最里面的循环,它通过 $GroupDefs 数组从当前位置 -1 ($p = ($i-1)) 向后移动到 0。当找到 Level-1 的第一个填充的先前值时,我知道那是组名.

$Member 是一个方便的变量。它设置为 $GroupDefs[$i].$Prop 因为给定 属性 的值是我们希望添加到尚未确定的组的成员。

注意:$GroupDefs.$i return没有预期的结果。在任何给定时刻,$i 都是由循环确定的数字,但它不是 $GroupDefs 数组或其中任何对象上的 属性 的名称。因此,它既不会 return 数组本身的任何 属性 值,也不会展开(枚举)其中包含的对象的任何属性。

注意:$Prop 的值将随着您遍历属性而改变,直到在 属性 上找到给定名称的值。

我知道这很令人困惑,但如果您单步执行代码,您会更好地理解发生了什么。首先,尝试理解字面意思是做什么。那么代码应该更有意义...