Для создания встроенного фильтра при попытке использовать оператор подвыражения $()
. Это позволит PowerShell обрабатывать все внутри, прежде чем передать его параметру -Filter
.
Get-ADUser -Filter "EmailAddress -eq '$($userobject.GivenName + '.' + $userobject.SurName + '@overflow.com')'"
В конечном итоге, как только PowerShell выполнит свое переменное расширение и интерполяцию строк, ожидается, что фильтр будет Property -operator 'Value'
или Property -operator "Value"
. То, как вы доберетесь до этого состояния, может варьироваться.
Как отмечал ответ Томалака , параметр -Filter
принимает строковое значение, а не блок скрипта. Почему создатели команд перечисляют это ({}
) в качестве предпочтительного синтаксиса в документации, остается загадкой. Поскольку он принимает строку, и вы редко хотите, чтобы содержимое строки было буквальным, лучше всего заключить фильтр в двойные кавычки. Затем используйте одинарные кавычки внутри. Иногда сложные фильтры могут содержать одинарные и двойные кавычки, но вам просто нужно следить за тем, чтобы одна открывающая цитата находила непреднамеренную закрывающую цитату. Причина, по которой множественные наборы кавычек даже необходимы, заключается в том, что -Filter
содержит операторы сравнения, которые ожидают, что правые части этих операторов будут заключены в кавычки. Если вы не смешиваете типы котировок, вам придется придумать более креативные способы, чтобы обойти интерполяцию. Ниже приведены некоторые примеры такого поведения. Обратите внимание, что Двойные кавычки снаружи и экранирование ... и Двойные кавычки снаружи и одиночные кавычки внутри - это сценарии, которые заставляют -Filter
получать то, что он хочет. Одиночные кавычки вне строки не позволяют переменным расширяться ($str
будет буквально $ str).
Двойные кавычки:
PS> "string with double quotes"
string with double quotes
Одиночные кавычки:
PS> 'single quotes'
single quotes
Двойные кавычки снаружи и одинарные кавычки внутри:
PS> "outside doubles 'inside singles'"
outside doubles 'inside singles'
Двойные кавычки снаружи и внутри:
PS> "double "double quotes""
At line:1 char:10
+ "double "double quotes""
+ ~~~~~~
Unexpected token 'double' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
With all that said, it is just more readable to do your string building outside of the filter first.
Одинарные и двойные кавычки внутри:
PS> 'outside singles "inside doubles"'
outside singles "inside doubles"
Двойные кавычки снаружи с одинарной кавычкой внутри:
PS> $str = "variable string"
PS> "outside doubles single variable '$str'"
outside doubles single variable 'variable string'
Одиночные кавычки снаружи с двойной кавычкой внутри:
PS> 'outside singles double variable "$str"'
outside singles double variable "$str"
Двойные кавычки снаружи, избегая двойных кавычек внутри:
PS> "fancy escaping with variable ""$str"""
fancy escaping with variable "variable string"
PS> "fancy escaping with variable `"$str`""
fancy escaping with variable "variable string"