Get-AdUser дает мне оператор не поддерживается ошибка - PullRequest
0 голосов
/ 18 июня 2019

Попытка найти электронную почту пользователя из свойств объекта, созданного с помощью Get-AdUser

Get-ADUser -Filter {EmailAddress -eq $userobject.GivenName + '.' + $userobject.SurName + '@overflow.com'}

Get-ADUser: Ошибка анализа запроса: 'EmailAddress -eq $ userobject.GivenName +'.'+ $ userobject.SurName + '@ nfiindustries.com' 'Сообщение об ошибке:' Оператор не поддерживается: 'в позиции:' 40 '.В строке: 1 символ: 1 + Get-ADUser -Filter {EmailAddress -eq $ userobject.GivenName + '.'+ $ u ...

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Для создания встроенного фильтра при попытке использовать оператор подвыражения $(). Это позволит 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"
1 голос
/ 18 июня 2019

Значение -Filter ведет себя больше как строка, и хотя оно очень старается выглядеть как блок скрипта со всеми фигурными скобками и операторами в стиле Powershell, это не блок скрипта. Поэтому большая часть синтаксиса, который будет работать в обычном коде скрипта PowerShell, недопустима для фильтра.

Лучше всего, когда вы рассматриваете это как строку. Предварительно вычислите любые значения, по которым вы хотите фильтровать, это значительно упрощает обработку.

$email =  $userobject.GivenName + '.' + $userobject.SurName + '@overflow.com'

Get-ADuser -Filter "EmailAddress -eq $email"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...