Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
String 需要列表中的每个名称才能查询active directory_String_Powershell_Foreach_Split_Line - Fatal编程技术网

String 需要列表中的每个名称才能查询active directory

String 需要列表中的每个名称才能查询active directory,string,powershell,foreach,split,line,String,Powershell,Foreach,Split,Line,为什么这只显示最后一个对象,而不是每个循环的所有对象 $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=BLA

为什么这只显示最后一个对象,而不是每个循环的所有对象

$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 : username@comain.com
试试这个:

$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'"
最简单的方法是使用数组中每个值之间的任何值进行联接。在本例中,“
”-或类似名称的“
位于$Names中的每个值之间

$JoinResult = $Names -Join "' -or Name -Like '"
$JoinResult-等式:

First1 Last1' -or Name -Like 'First2 Last2' -or Name 'First3 Last3' -or Name -Like 'First4 Last4
下一步是结束它。。(该筛选器字符串的开始和结束)您希望筛选器以
名称开头,如“
”,以结尾的

$Filter = "Name -Like '$JoinResult'"
在一行中完成所有这些是:

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

添加-Split和\r修复了我的问题。感谢@gbabu和@Bacon Bits为我指引了正确的方向。

可能是Windows行尾。尝试
Get ADUser-Filter{Name-like$line.Trim()}
或者,尝试
$str.Split(`r`n”)
.Get ADUser:Property:'Trim'未在类型为:'System.String'的对象中找到。只需在事实之后添加注释,
.Trim()
方法可以很好地工作,如果您使用子表达式,例如:
Get ADUser-Filter{Name-like$($line.Trim())}
好奇,你能解释一下这个代码吗
'$($Names-Join''-或Name-like')
您需要以下sting模式:(Name-like'$Name
')-或(Name-like'
$Name
')-或(Name-like'
$Name')等等。。你看到图案了吗?因此,将$names中的每个$name与中间的这个模式连接起来,就形成了一个漂亮的大过滤器字符串……)美妙之处在于,如果$names中只有一个名称,它不会将模式放在两者之间,只需输出$name..OIC如果名称在列表中有前导或尾随空格或名称?像First-Last先生或First-Last Jr.我走对了吗?那么你是在寻找字符串内部的模式吗?更新了我的答案,逐步介绍了如何从数组构建长筛选查询。希望这有帮助。
foreach ($line in $str -Split('\r\n')) {
Get-ADUser -Filter {Name -eq $line} 
}