2015-05-14 30 views
0

我有一個冒號分隔的CSV像這樣,防止PowerShell的的ForEach從添加多餘的行情

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

它,然後添加到一個變量:

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

現在,我與它的工作:

foreach ($record in $file) { 
    $record.Users | % { get-aduser $_ } 
} 

在foreach循環中報告$record.Users("jsmith","trex")write-host

但是,get-aduser(或其他cmdlet)抱怨說,它無法找到標識爲'("jsmith","trex")'的對象。

如何防止foreach向參數添加單引號?

我已經嘗試過類似"sjobs","bfranklin"但進口CSV帶雙引號的用戶訪問的sjobs

或者更好的,你如何通過用戶的列表的foreach?

PowerShell版本4

回答

0

引號不是由PS添加的。他們就在你的檔案中。下面是一個片段,讓您在正確的方向開始:

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

是的,雙引號在文件中,但單引號確實被添加。感謝您的提示,使用.split作爲解決方法。 – jcarpio

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")} 
}