【问题标题】:Need every name in the list to query active directory需要列表中的每个名称来查询活动目录
【发布时间】:2015-07-17 04:05:00
【问题描述】:

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

$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

【问题讨论】:

  • Windows 行尾,可能。试试Get-ADUser -Filter {Name -like $line.Trim() } 或者,试试$str.Split("`r`n")
  • Get-ADUser:属性:在类型对象中找不到“Trim”:“System.String”。
  • 只是事后的评论,.Trim() 方法如果你子表达它就可以正常工作,例如:Get-ADUser -Filter {Name -like $($line.Trim()) }

标签: string powershell foreach split line


【解决方案1】:

试试这个:

$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 -eq :

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

【讨论】:

  • 好奇你能解释一下这段代码吗? '$($Names -Join "' -or Name -like '")'
  • 您想要以下刺痛模式:(Name -Like '$name') -or (Name -Like '$name') -or (Name -Like '$name') 等等.. 你看到这个模式了吗?因此,将 $names 中的每个 $name 与中间的这种模式连接起来,就形成了一个不错的大过滤字符串.. ;)
  • 妙处是,如果$names中只有1个名字,它就不会把pattern放在中间,直接输出$name..
  • OIC 如果名称在列表中有前导或尾随空格或名称?像 First Last 先生或 First Last Jr 先生一样。我在正确的轨道上吗?所以你正在寻找字符串内部的模式?
  • 更新了我的答案,详细介绍了如何从数组构建长过滤器查询。希望这会有所帮助。
【解决方案2】:
foreach ($line in $str -Split('\r\n')) {
Get-ADUser -Filter {Name -eq $line} 
}

添加 -Split 和 \r 解决了我的问题。感谢@gbabu 和@Bacon Bits 引导我朝着正确的方向前进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多