Класс PowerShell 5: модуль импорта, необходимый для типа

Я написал класс PowerShell 5:

class ConnectionManager
{

  # Public Properties
  static [String] $SiteUrl
  static [System.Management.Automation.PSCredential] $Credentials
  static [SharePointPnP.PowerShell.Commands.Base.SPOnlineConnection] $Connection
  ...
}

Тип «SharePointPnP.PowerShell.Commands.Base.SPOnlineConnection» взят из настраиваемого (установленного модуля) с именем «SharePointPnPPowerShell2016».

Мой класс находится внутри другого модуля / файла с именем «connection.manager.psm1».

Когда я загружаю этот модуль, чтобы использовать этот класс, он возвращает мне следующую ошибку:

> Import-Module connection.manager.psm1
At connection.manager.psm1:6 char:11
+   static [SharePointPnP.PowerShell.Commands.Base.SPOnlineConnection]  ...
+           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Unable to find type
[SharePointPnP.PowerShell.Commands.Base.SPOnlineConnection].

Когда я вручную загружаю модуль (PNP) в сеанс PowerShell перед загрузкой моего модуля, он загружается правильно, и я могу его использовать.

Но я не хочу всегда вручную загружать другой модуль, прежде чем использовать свой модуль. Я попытался импортировать PNP-модуль прямо в свой модуль, добавив:

Import-Module "SharePointPnPPowerShell2016"

в начале, перед объявлением класса, но это ничего не меняет, по-прежнему появляется ошибка «Невозможно найти тип».

Есть идеи, как это сделать правильно?


person Patric    schedule 15.02.2018    source источник


Ответы (2)


Я думаю, вы можете решить эту проблему, используя манифест модуля

Вы можете использовать разделы «Требуемый модуль» и «Требуемая сборка». Это должно обрабатывать загрузку требований (если они установлены), когда вы загружаете свой настраиваемый модуль, который содержит класс.

person Sambardo    schedule 15.02.2018
comment
Ты прав. Я успешно протестировал его, используя манифест модуля, который включает следующую строку: RequiredModules = @ ('SharePointPnPPowerShell2016'). Это привело к правильной загрузке модуля без ошибок. Единственная проблема в том, что мне иногда нужна версия ... 2016, а иногда и 2013, и мне не нужны 2 базы кода. Но это другой вопрос, который я разберу сам :-) - person Patric; 19.02.2018
comment
Рад, что смог помочь! Совместимо ли имя с подстановочными знаками, такими как SharePoiuntPnPPowerShell201 *? - person Sambardo; 19.02.2018

Если вы объявили класс в модуле, вы не можете использовать его, если Import-Module; это только вводит командлеты, функции и псевдонимы. Вместо этого ваш сценарий должен Using module модуль; это принесет класс, а также другие экспортируемые предметы.

(На самом деле я неправильно понял проблему; это не помогает решить конкретную проблему кверента, но для класса, который не использует классы из других модулей, это позволит импортировать классы из модулей. Кверент обнаружил известную проблему в PowerShell; см. комментарии для получения дополнительной информации.)

person Jeff Zeitlin    schedule 15.02.2018
comment
Похоже, что в настоящее время этого нет в PowerShell 5, но, возможно, он поставляется с PowerShell 6.1 - github.com/ PowerShell / PowerShell / issues / 2074 или я ошибаюсь? - person Patric; 15.02.2018
comment
Попробуйте Using module "SharePointPnPPowerShell2015" в своем модуле. - person Jeff Zeitlin; 15.02.2018
comment
К сожалению, это не работает. Я использую модуль SharePointPnPPowerShell2016 в качестве первой строки (и этот модуль существует), но когда я загружаю свой модуль с использованием модуля в PowerShell (5.0.10586.117), он снова говорит «Невозможно найти тип» [SharePointPnP.PowerShell.Commands.Base.SPOnlineConnection] . - person Patric; 15.02.2018
comment
Хорошо, это вполне может быть та проблема, о которой вы обратили внимание на GitHub. - person Jeff Zeitlin; 15.02.2018
comment
Это не работает, я тоже сталкивался с этой проблемой (и проблемой на Github) в прошлом. Используя сценарий вызывающего абонента, в котором вы сначала добавляете типы (либо через Add-Type, либо с помощью Reflection), а затем вызываете свой сценарий PS, который включает ваши классы, должен работать, хотя ... - person bluuf; 15.02.2018