将成员添加到通讯组 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
的值将随着您遍历属性而改变,直到在 属性 上找到给定名称的值。
我知道这很令人困惑,但如果您单步执行代码,您会更好地理解发生了什么。首先,尝试理解字面意思是做什么。那么代码应该更有意义...
我有以下 .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
的值将随着您遍历属性而改变,直到在 属性 上找到给定名称的值。
我知道这很令人困惑,但如果您单步执行代码,您会更好地理解发生了什么。首先,尝试理解字面意思是做什么。那么代码应该更有意义...