Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Powershell-在阵列中加入项目_Arrays_Powershell - Fatal编程技术网

Arrays Powershell-在阵列中加入项目

Arrays Powershell-在阵列中加入项目,arrays,powershell,Arrays,Powershell,如果以前有人问过这个问题,我真的很抱歉。我花了一些时间在谷歌上搜索这个问题,但似乎没有任何东西符合我的查询 我正在从CSV文件创建新的用户帐户,这很好,只有组成员信息分布在40个不同的单元格中。一个例子如下: USERNAME,Group1,Group2,Group3 User1,Exchange,Office User2,Office,HTTP,FTP User3,Office 目前,我能想到的实现这一目标的唯一方法是: IF ( $IMPORT.Group1 -ne $NULL ) { A

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

我正在从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个细胞,这似乎有点冗长。 有没有更简单的方法来实现这一点


谢谢

我会或多或少忽略这是一个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
    }
}
这应该是显而易见的,但要快速解释:

第1行:加载数据。
第2行:去掉标题行,只留下实际数据
第3行:对于文件的每一行,
第4行:将其转换为数组。此数组将具有用户名
在第一个插槽(索引0)和其余插槽中,
无论有多少组,都会有供用户使用的组。
第5行:提取用户名。。。
第6行:…并将其从现在只包含组的数组中删除
第7行:对于每组,
第8行:向其中添加用户。
第9行:(终端组处理)
第10行:(结束处理文件)

我或多或少会忽略这是一个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
    }
}
这应该是显而易见的,但要快速解释:

第1行:加载数据。
第2行:去掉标题行,只留下实际数据
第3行:对于文件的每一行,
第4行:将其转换为数组。此数组将具有用户名
在第一个插槽(索引0)和其余插槽中,
无论有多少组,都会有供用户使用的组。
第5行:提取用户名。。。
第6行:…并将其从现在只包含组的数组中删除
第7行:对于每组,
第8行:向其中添加用户。
第9行:(终端组处理)
第10行:(结束处理文件)
如果只有一小部分细胞,我会用这个,但因为有多达40个细胞,这似乎有点冗长。有没有更简单的方法来实现这一点

这可能意味着您实际拥有的CSV列数与拥有最多组数的用户的列数相同。如果是这样的话,
导入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对象{“Group$\}
也可以工作,但您必须硬编码潜在的数字。我的例子对于一个格式正确的CSV文件来说很有用。如果一行没有40个组,则可以。PowerShell将使用null填充这些其他组列,这不是一个问题。关于您的文件和我的解决方案,重要的一点是您需要正确填充头

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

您根本不需要保存
$groups
,只需将这两个命令连接在一起,但作为其单独的部分更容易阅读和解释

如果只有一小部分细胞,我会用这个,但因为有多达40个细胞,这似乎有点冗长。有没有更简单的方法来实现这一点

这可能意味着您实际拥有的CSV列数与拥有最多组数的用户的列数相同。如果是这样的话,
导入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对象{“Group$\}
也可以工作,但您必须硬编码潜在的数字。我的例子对于一个格式正确的CSV文件来说很有用。如果一行没有40个组,则可以。PowerShell将使用null填充这些其他组列,这不是一个问题。关于您的文件和我的解决方案,重要的一点是您需要正确填充头

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


您根本不需要保存
$groups
,只需将这两个命令连接在一起,但作为其单独的部分更容易阅读和解释

请注意原始海报-如果是你对我的答案投了赞成票,并且对你有效,如果你接受答案,我将不胜感激-单击复选标记。它在摘要中显示问题已经“解决”,它给了我更多的代表性,而不仅仅是追加投票。那么你的CSV文件中有40个组列?除此之外,还有其他的列,或者仅仅是用户名,X组的数目不是我赞成的,而是考虑它完成的。工作就像一个绝对的魅力。非常感谢你@马特-我差不多就是这么解释的。当然,在我的组织中,我见过这么多的用户……我要求OP,因为导入CSV可以,但只有在这40列存在的情况下。样本数据和解释是不同的,这就是我提问的原因。请注意原始海报-如果是你对我的答案投了赞成票,并且对你有效,如果你愿意接受答案,我将不胜感激-点击复选标记。在总结中可以看出