防止Powershell ForEach添加多余的报价

时间:2015-05-14 18:03:49

标签: powershell

我有像这样的冒号分隔的CSV,

Mailbox:Users
AcmeCorp:("jsmith","trex")
XyzCorp:("sjobs","bfranklin")

然后将其添加到变量:

$file = import-csv file.csv -delimiter :

现在,我使用它:

foreach ($record in $file) {
    $record.Users | % { get-aduser $_ }
}
foreach循环报告中的

write-host $record.Users("jsmith","trex")

但是,get-aduser(或其他cmdlet)会抱怨它无法找到标识为'("jsmith","trex")'的对象。

如何防止foreach在参数中添加单引号?

我已尝试像"sjobs","bfranklin"这样的用户,但import-csv会从sjobs

中删除双引号

或者更好的是,如何将用户列表传递给foreach?

PowerShell版本4

2 个答案:

答案 0 :(得分:0)

PS没有添加引号。它们就在您的文件中。这是一个片段,为您提供正确的方向:

$file = Import-csv file.csv -delimiter ':'
foreach($row in $file){
    foreach($user in $row.Users.split(',')){
        Get-ADUser ($user.replace('(','').Replace('"','').replace(')',''))
    }
}

答案 1 :(得分:0)

我认为这里的问题是你认为你正在导入一个字符串数组作为Users的值,但实际上你只是导入一个字符串。这里有几个选项,使用您已经发现的split方法:

$file = import-csv file.csv -delimiter ':'
ForEach($Record in $File){
    $Record.Users.Trim('()').Split(',') | ForEach{
        Get-ADUser $_.Trim('"')
    }
}

所以$Record.Users.Trim('()')从字符串中删除括号。然后它使用.Split(',')将字符串拆分为字符串数组。然后在从每个字符串中获取ADUser之后将其传递给内部ForEach循环,从中移除引号(使用.Trim('"'))。

或者,每行可以有一个用户,因此您的CSV将显示为:

Mailbox:User
AcmeCorp:jsmith
AcmeCorp:trex
XyzCorp:sjobs
XyzCorp:bfranklin

然后在导入CSV之后,您可以根据需要按邮箱分组,例如,为每个邮箱添加用户或其他内容:

$File = Import-CSV C:\Path\To\File.csv -delimiter ':'
$MBGroups = $File | Group Mailbox
ForEach($Record in $MBGroups){
    $Mailbox = $Record.Name
    $Users = $Record.Group | ForEach{Get-ADUser $_.User}
    $Users | ForEach{Set-ADUser -mail ($_.samaccountname+"@"+$Mailbox+".com")}
}