如何筛选AdObjects集合中含指定文本的属性并仅输出匹配属性?
PowerShell 筛选AD对象并保留匹配属性的实现方案
需求说明
拥有$adObjects集合,需筛选出属性值包含指定文本(示例为bingo!)的对象,且仅保留这些对象的name属性和所有值匹配的属性。
示例输入
# $adObjects包含以下对象及属性 $adObjects name : object1 property1 : asdf property2 : bingo! property3 : bingo! name : object2 property1 : asdf property2 : bingo! property3 : asdf name : object3 property1 : asdf property2 : asdf property3 : asdf
预期输出
name : object1 property2 : bingo! property3 : bingo! name : object2 property2 : bingo!
思路验证与代码实现
你的思路完全正确,Select-Object只能预先指定固定属性,无法动态根据属性值筛选并保留匹配项,必须通过遍历实现。以下是可直接运行的代码:
$targetText = "bingo!" $result = $adObjects | ForEach-Object { $currentObj = $_ # 筛选值包含目标文本的属性 $matchingProps = $currentObj.PSObject.Properties | Where-Object { $_.Value -like "*$targetText*" } # 仅当存在匹配属性时,构建输出对象 if ($matchingProps.Count -gt 0) { $outputProps = [ordered]@{ name = $currentObj.name } foreach ($prop in $matchingProps) { $outputProps[$prop.Name] = $prop.Value } [PSCustomObject]$outputProps } } # 输出最终结果 $result
简化优化版本
核心逻辑不变,可通过PowerShell的集合操作简化代码结构:
$targetText = "bingo!" $adObjects | ForEach-Object { $matchProps = $_.PSObject.Properties.Where({$_.Value -like "*$targetText*"}) if ($matchProps) { [PSCustomObject] ([ordered]@{ name = $_.name } + ($matchProps | Select-Object Name,Value | ConvertTo-HashTable -AsOrdered)) } }
内容的提问来源于stack exchange,提问作者Matthew McDonald
相关产品推荐
相关产品推荐

