Помещение «using namespace ...» в PowerShell Module. Сценарий PSM1 не работает после импорта модуля - PullRequest
1 голос
/ 03 мая 2020

Я пишу модуль PowerShell, который используется в качестве оболочки для. Net (Do tNet) Сборка 'Framework.Core.Measurements.dll'.

Версия PowerShell 5.1. * в Windows 7 64 бита.

В моем файле .psd1 добавлена ​​сборка в список RequiredAssemblies:

RequiredAssemblies = @('Framework.Core.Measurements.dll')

I В моем .psm1 я добавил выражение "using пространство имен" :

using namespace Framework.Core.Measurements

Я использовал "Import-Module -Verbose", чтобы убедиться, что .pdm1 действительно выполняется.

После успешного импорта я пытаюсь использовать перечисление Angle, которое есть в " Пространство имен Framework.Core.Measurements, но PowerShell не распознает его, несмотря на оператор «using namespace ...», который был выполнен в сценарии .psm1.

Если я напечатал «using пространство имен Framework.Core. Измерения "в командной строке PowerShell, тогда он работает.

Любая идея или обходной путь?

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Я не рассматривал использование ScriptsToProcess на первом месте по документации, которую его сценарии выполняли до импорта модуля.

То есть я был уверен, что сборка. Net должна быть уже загружен, прежде чем запускать "использование пространства имен" для любого из имеющихся им пространств имен.

Теперь я понимаю, что можно выполнить оператор using namespace, даже если с ним в данный момент не связан код.

Ваш ответ мне очень помог.

Спасибо.

0 голосов
/ 03 мая 2020

Вы не можете импортировать пространства имен для средства импорта вашего модуля через *.psm1 файл :

Оператор using namespace вступает в силу для области, в которой он выполняется и все дочерние области, поэтому выполнение такого оператора внутри файла *.psm1 не влияет на область, импортирующую модуль.

Обходной путь заключается в размещении вызовите *.ps1 скрипт , на который вы должны ссылаться из записи ScriptsToProcess манифеста вашего модуля (см. New-ModuleManifest справку topi c).

Такие сценарии запускаются непосредственно в импортируемой области кода (они поставляются с точками), но учтите, что это происходит только первый раз, когда данный модуль импортируется в сеанс - см. эту проблему GitHub .

Примечание. Хотя сборки, на которые ссылается запись RequiredAssemblies , загружаются до того, как сценарии, указанные в ScriptsToProcess, являются точечными -поставляется в объеме вызывающего (см. ниже), порядок на самом деле не tter:

  • Как вы обнаружили, PowerShell позволяет выполнять оператор using namespace независимо от того, загружены ли какие-либо сборки с типами в этом пространстве имен в это время ; вместо этого PowerShell просматривает любые пространства имен, которые вы ранее передали using namespace, всякий раз, когда вы пытаетесь получить доступ к типу по простому имени (например, [Angle]).

В качестве отступления: Обычно элементы импортируемого модуля выполняются в следующем порядке:

  • Загрузка сборок, указанных в RequiredAssemblies.
  • Точечный поиск сценариев, указанных в ScriptsToProcess.
  • Рекурсивный импорт любых вложенных модулей, указанных в NestedModule.
  • Импорт основного модуля, указанного в RootModule.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...