我们先研究你给的csv文件格式:
Name,DN EmailGroup1,"CN=EmailGroup,OU=Groups,DC=Test,DC=COM","CN=CompanyGroup,OU=Groups,DC=Test,DC=COM" EmailGroup2,"CN=EmailGroup,OU=Groups,DC=Test,DC=COM","CN=CompanyGroup,OU=Groups,DC=Test,DC=COM" EmailGroup3,"CN=EmailGroup,OU=Groups,DC=Test,DC=COM","CN=CompanyGroup,OU=Groups,DC=Test,DC=COM"
第一行是两列,Name,DN
第二行其实是3列,
- EmailGroup1
- “CN=EmailGroup,OU=Groups,DC=Test,DC=COM”
- “CN=CompanyGroup,OU=Groups,DC=Test,DC=COM”
可能还会有更多。
这样通过Import-Csv导入以后,我们先看看输出:
PS D:\> Import-Csv .\MailGroup.csv Name DN ---- -- EmailGroup1 CN=EmailGroup,OU=Groups,DC=Test,DC=COM EmailGroup2 CN=EmailGroup,OU=Groups,DC=Test,DC=COM EmailGroup3 CN=EmailGroup,OU=Groups,DC=Test,DC=COM
很明显,只读到了2列,因为第一行的头只有Name,和DN两个。
最终导致你自己脚本循环中的$Group.DN其实是一个string。。
PS D:\> (Import-Csv .\MailGroup.csv)[0].DN.GetType().FullName System.String
然后研究你的Set-ADGroup EmailGroup -Add 后面的参数可知authOrig的值是一个字符串数组
这样肯定就会导致参数不匹配。
=============================================
从这里分隔,看解决方案
综上所述,因为该csv文件的特殊格式,坑在于csv的头个数和csv的数据行个数不匹配。既然头多了可以,但是不能少,那我们就不要用csv文件中的头,自己给他加头,加多少呢?5个,还是10个,反正多多益善。
下面就不废话了,直接上脚本了:
#自定义csv文件头 $customHeader = @("Group") #假设DN后面最多有5个 $maxDNColumns = 5 1..$maxDNColumns | foreach { $customHeader+="CN$_" } Get-Content .\MailGroup.csv | select -Skip 1 | #忽略源文件中的头 ConvertFrom-Csv -Header $customHeader | #加入我们自己定义的头 foreach { $group = $_.Group $dnPara = @() #循环获取CN1到CN...N的值,拼接成字符串数组 for($dnIndex=1;$dnIndex -le $maxDNColumns;$dnIndex++ ){ $value = $_."CN$dnIndex" if( -not [string]::IsNullOrWhiteSpace($value)){ $dnPara+=$value } else{ break; } } ##这里再执行你那关键的业务命令 Set-ADGroup $group -Add @{authOrig = $dnPara} }