Powershell - 连接数组中的项目

时间:2017-02-28 12:37:22

标签: arrays powershell

如果之前有人询问,我真的很抱歉。我花了一些时间谷歌搜索问题,但似乎没有任何东西符合我的疑问。

我正在从CSV文件创建新的用户帐户,这很好,只有组成员身份信息分布在40个不同的单元格中。一个例子如下:

USERNAME,Group1,Group2,Group3
User1,Exchange,Office
User2,Office,HTTP,FTP
User3,Office

目前,我能想到实现这一目标的唯一方法是:

IF ( $IMPORT.Group1 -ne $NULL ) { Add-AdGroupMember $IMPORT.Group1 -Member $IMPORT.Username }

如果只有少数几个细胞,我会选择这个,但是因为有40个,所以看起来似乎有点长篇大论。 有没有更简单的方法来实现这一目标?

由于

2 个答案:

答案 0 :(得分:3)

我或多或少会忽略这是一个CSV的事实,并自己解析:

$ListData = Get-Content -Path \\Fully\Qualified\File\Name\Of\File.csv
$ListData = $ListData[1..$(($ListData.Length)-1)] # Gets rid of header line
ForEach ($line in $ListData) {
    $words = $line -split ','
    $UserName = $words[0]
    $words = $words[1..$(($words.length)-1)] # Gets rid of username, leaves only groups
    ForEach ($group in $words) {
        Add-ADGroupMember -Identity $Group -Members $UserName
    }
}

这应该是显而易见的,但快速解释:

Line  1: Loads the data.
Line  2: Gets rid of the header line, leaving only the actual data
Line  3: For each line of the file,
Line  4:    Convert it into an array. This array will have the user name
           in the first slot (index 0), and the rest of the slots, 
           however many there are, will be the groups for the user to be in.
Line  5:    Extract the user name...
Line  6:    ...and delete it from the array, which now contains only groups
Line  7:    For each group,
Line  8:        Add the user to it.
Line  9:    (end group processing)
Line 10:(end processing the file)

答案 1 :(得分:1)

  

如果只有少数几个细胞,我会选择这个,但是因为有40个,所以看起来似乎有点长篇大论。有没有更简单的方法来实现这一目标?

这可能意味着您实际上拥有的CSV列数与具有最大数量的组的用户一样多。如果是这种情况Import-CSV仍然是你的朋友。

$users = Import-CSV $path

# Determine all of the columns that contain Group values. 
$groupProperties = $users[0].Psobject.Properties | 
    Where-Object{$_.MemberType -eq "NoteProperty" -and $_.Name -like "Group*"} | 
    Select-Object -ExpandProperty Name

Foreach($user in $users){
    # Collect all the groups for this user into an array
    $groups = $groupProperties | ForEach-Object{$user.$_}

    # Add the user into each of the groups
    $groups | Foreach-object{Add-AdGroupMember $_ -Member $user.Username}
}

诀窍是我们从导入的CSV数据中取出第一行并检查以“Group”开头的所有属性。不管你有多少。然后我们有一个字符串数组,其中包含可以在每个用户的循环中使用的每个组列。

1..40 | ForEach-Object{"Group$_"}也可以,但您必须对潜在的数字进行硬编码。对于正确形成的CSV文件,我的示例将正常运行。如果一行没有40组,那就没问题。 PowerShell将使用null填充其他组列,这不是问题。关于您的文件和我的解决方案的重要一点是您需要正确填充标头。

对于我们收集的每个用户组,并将其保存到变量$groups。空值不会传递给管道,因此不需要考虑它们。

您根本不需要保存$groups,只需将两个命令连接在一起,但它更容易阅读和解释为各个部分。