Я бы сделал это по-другому, используя Compare-Object и запросив только AD один раз.
$groups = Get-Content C:\Groups.txt
$membership = Get-ADPrincipalGroupMembership -Identity serviceaccountname | Select -Expand Name
$results = $membership | Compare-Object $groups -IncludeEqual -ExcludeDifferent |
Select -Expand InputObject | Sort
Вам нужна расширяемая строка, если вы хотите, чтобы переменная внутри была заменяется значением. Строки в одинарных кавычках являются литеральными строками. Строки в двойных кавычках позволяют выполнять интерполяцию внутри. Таким образом, '$groups'
вернет текст $groups
, а "$groups"
вернет значение $groups
. Однако в этом случае кавычки не нужны, если вы ищете точные совпадения. Для точных совпадений более эффективно использовать -eq
в пользу -like
. Следуя этим идеям, ваш код будет изменен на следующее:
$groups = Get-Content C:\Groups.txt
$results = foreach ($group in $groups) {
Get-ADPrincipalGroupMembership -Identity serviceaccountname |
select -ExpandProperty Name | Where-object { $_ -eq $group } | Sort
}
Вы можете сделать этот шаг дальше и повысить эффективность, устраняя необходимость в цикле. Это можно сделать с помощью операторов сдерживания .
$groups = Get-Content C:\Groups.txt
$results = Get-ADPrincipalGroupMembership -Identity serviceaccountname |
Select -ExpandProperty Name | Where-object { $_ -in $groups } | Sort
}
Если вы будете следовать примерам, предоставленным О правилах цитирования , вы можете увидеть различия между строки в двойных и одинарных кавычках. Вот тривиальный пример:
PS> $str = "mystring"
PS> '$str' # Single quotes = No substitution
$str
PS> "$str" # Double quotes = Substitution
mystring
PS> $str # No quotes = substitution
mystring