На самом деле вы видите нечто более тонкое. С -Namespace вы не можете выполнить аргумент типа в пространстве имен дважды
Я подозреваю, что вы создаете New-WebServiceProxy много, например, в блоке процесса функции или внутри команды, которая вызывается повторно. Каждый раз, когда вы вызываете его, он пытается регенерировать, и, с -Namespace, это оставляет небольшие коллизии со связанными типами в AppDomain. В итоге их несколько, и вы получите эту ошибку.
Есть два пути решения этой проблемы:
- Убедитесь, что он импортируется один и только один раз для каждого домена приложений. В чем-то вроде PowerGUI или ISE это может быть сложнее, чем кажется, потому что есть не только пространства выполнения, о которых вы думаете (например, открытые вкладки), но и пространства выполнения, которых вы не делаете (например, запускаемые надстройками или незавершенные работы)
- Гораздо более "простой", но значительно более загадочный обходной путь заключается в простом создании типов относительно определенного пространства имен.
Это гораздо проще показать, чем сказать.
У меня была эта проблема с модулем, который у меня есть для Office365 / Exchange Web Services, и под прикрытием он имеет что-то вроде:
$createItemType =
New-Object "$script:ExchangeWebServiceNamespace.CreateItemType"
-Property @{
MessageDisposition = $messageDisposition
MessageDispositionSpecified = $true
Items =
New-Object "$script:ExchangeWebServiceNamespace.NonEmptyArrayOfAllItemsType"
}
Это, очевидно, немного загадочно, но, как и веб-службы Exchange. Как и многие веб-сервисы, созданные непосредственно из сложных объектных моделей.
К сожалению, это подавляющее большинство веб-сервисов, с которыми работает New-WebServiceProxy.
Имейте в виду, что по-прежнему рекомендуется кэшировать объект веб-службы, который вы создаете в своем модуле (используя $script:variablename
, как описано выше), но этот странный трюк для ссылки на части веб-службы через прокси-объект спас меня больше раз, чем Я бы хотел.
Надеюсь, это поможет