2015-05-06 48 views
0

爲什麼只顯示每個循環的最後一個對象而不是全部?需要列表中的每個名稱來查詢活動目錄

$str = @" 
First1 Last1 
First2 Last2 
First3 Last3 
First4 Last4 
"@ 

foreach ($line in $str.Split("`n")) { 
    $userOBJ = Get-ADUser -Filter {Name -like $line} 
    $userOBJ 
} 

輸出只有一個記錄。

DistinguishedName : CN=First Last,OU=BLAH and BLAH,OU=BLAH BLAH,DC=corp,DC=domain,DC=com 
Enabled   : True 
GivenName   : First 
Name    : First Last 
ObjectClass  : user 
ObjectGUID  : XXXXXX-XXXXXXXXX 
SamAccountName : useranme 
SID    : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
Surname   : Last 
UserPrincipalName : [email protected] 
+0

Windows行結束,可能。嘗試'Get-ADUser -Filter {Name-like $ line.Trim()}'或者,試試'$ str.Split(「\'r \'n」)'。 –

+0

Get-ADUser:屬性:在'System.String'類型的對象中找不到'修剪'。 –

+1

只需在事實之後發表評論,如果您使用子表達式,'.Trim()'方法可以正常工作,例如:'Get-ADUser -Filter {Name-like $($ line.Trim())}' – TheMadTechnician

回答

2

試試這個:

$str = @" 
First1 Last1 
First2 Last2 
First3 Last3 
First4 Last4 
"@ 

#Split your string and remove empty/null values. 
$Names = $str.Split("`r`n") | ? { $_ } 

#Make one filter request with all your names. 
$Filter = "Name -like '$($Names -Join "' -or Name -like '")'" 

Get-ADUser -Filter $Filter 

製作一個請求AD與許多過濾器將提高速度和更少的開銷,爲您的域控制器。

澄清如何創建過濾器

如果想建立使用多個搜索結果的高過濾器,你需要這樣格式化您的過濾器:

$Filter = "Name -Like 'First1 Last1' -or Name -Like 'First2 Last2' -or Name 'First3 Last3' -or Name -Like 'First4 Last4'" 

最簡單的方法是與你的數組中的每個值之間進行連接。在這種情況下,' -or Name -Like '位於$ Names中的每個值之間。

$JoinResult = $Names -Join "' -or Name -Like '" 

$ JoinResult當量:

First1 Last1' -or Name -Like 'First2 Last2' -or Name 'First3 Last3' -or Name -Like 'First4 Last4 

下一步要蓋它關閉。(開始和結束到過濾字符串)您希望您的過濾器開始Name -Like '和塗料後'

$Filter = "Name -Like '$JoinResult'" 

而做這一切在一行是:

$Filter = "Name -like '$($Names -Join "' -or Name -like '")'" 
+0

這個答案也很有效@mkellerman謝謝:) –

+0

很高興能幫到 –

+0

好奇你能解釋一下這段代碼嗎? ''$($ Names -Join'''或名稱''')'' –

0
foreach ($line in $str -Split('\r\n')) { 
Get-ADUser -Filter {Name -eq $line} 
} 

添加-Split和\ r修復了我的問題。感謝@gbabu和@Bacon Bits帶領我朝着正確的方向前進。

相關問題