Параметр -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 была создана для решения этой проблемы.