Проблема размещения переменной в командлете с "-eq" - PullRequest
3 голосов
/ 21 октября 2019

Я пытаюсь сделать что-то очень простое в PowerShell в Exchange 2019, но, судя по всему, я не могу разобраться с простым размещением переменных. Эта проблема не имеет ничего общего с Exchange, просто чистый PS.

Мне нужно выполнить командлет

New-AddressList "XX Users" -RecipientFilter {((CustomAttribute2 -eq "XX") -and (RecipientType -eq 'UserMailbox'))}

, что нормально, но я хочу заменить «XX Users» и «XX»"с переменными.

Я могу заменить «XX Пользователей», сказав что-то вроде

$var1 = "XX Users" (this actually works)
$var2 = "XX" (does not work)

, поэтому я получаю

New-AddressList $var1 -RecipientFilter {((CustomAttribute2 -eq $var2) -and (RecipientType -eq 'UserMailbox'))}

за жизнь, которую $var2 не вставляетправильное значение для -eq. Я пробовал множество комбинаций, в том числе использование одинарных кавычек, двойных кавычек, где объект, перемещение фигурных скобок и я никуда не попал. Он принимает его как буквальное или нулевое.

1 Ответ

1 голос
/ 21 октября 2019

Параметр -RecipientFilter имеет тип [string], что означает, что литерал содержимое передаваемого вами блока скрипта - все, что находится между открытием { и закрытием} - передается как значение.

То есть, нет интерполяция ссылок на переменные, таких как $var2, так что, если только New-AddressList сама не выполнит эту интерполяцию, осуществляя доступпеременные вызывающего, $var2 будут использоваться дословно , что не является вашим намерением.

Это похоже на ту же проблему, что и с фильтрами AD (Active Directory) - см. этоответ (за исключением того, что последний на самом деле делает интерполирует простые ссылки на переменные, но не выражений , таких как $var2.Name, поэтому лучше неполагайтесь на это).

Как и в случае с AD, лучший подход заключается в создании аргумента -RecipientFilter в виде строки , в частности, в виде . расширяемая строка ("...") , в которой вы можете найтиn встроенная переменная значения :

# Construct the filter as an *expandable string*.
# Note that $var2 is instantly replaced by its value, so
# you still need quoting around it.
# The assumption is that $var2's value doesn't contain single quotes itself.
$filterString = "((CustomAttribute2 -eq '$var2') -and (RecipientType -eq 'UserMailbox'))"

New-AddressList $var1 -RecipientFilter $filterString

Если $var2 может содержать ' символов. Сам замените $var2 на выражение, которое избегает этих;если New-AddressList ожидает того же выхода, что и сам PowerShell, то есть удваивает ' символов. - замените $var2 на $($var2 -replace "'", "''").


Любопытно, что на момент написания этой статьи официальная справочная тема активно рекомендует синтаксис { ... } без указания его фундаментальнойограничение, и все примеры команд показывают фильтры только с литералами. Эта проблема GitHub была создана для решения этой проблемы.

...