Powershell v4 не импортирует модуль автоматически

Я использую Microsoft PowerShell v4:

PS C:\> get-host

Name             : ConsoleHost
Version          : 4.0
InstanceId       : 3b4b6b8d-70ec-46dd-942a-bfecf5fb6f31
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : de-CH
CurrentUICulture : en-US
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

Я разработал проект C# в Visual Studio 2012, ориентированный на .NET Framework 4, который содержит некоторые Cmdlet и Snapin. Я могу отлаживать их, и все работает нормально.

Я создал путь C:\PowerShell\Modules\ и добавил его в переменную окружения PSModulePath.

Я положил rMySnapIn.dll на путь C:\PowerShell\Modules\MySnapIn.

Я ожидал, что модуль будет загружен автоматически, поэтому мои новые командлеты готовы к использованию, но это не так: модуль не загружен. Мне нужно написать Import-Module MySnapin, чтобы он загрузился.

Как сделать так, чтобы модуль загружался автоматически?


person JoanComasFdz    schedule 28.05.2014    source источник


Ответы (4)



Контрольный список, который может помочь вам определить проблему:

  1. Согласно разделу Что нового в Windows PowerShell, "Автоматический импорт модулей запускается (а) использованием командлета в команде, (б) запуском Get-Command для командлета без подстановочных знаков или (В) запуском Get-Help для командлета без подстановочных знаков». (Это относится к V3 и V4.) Как вы убедились, что модуль не загружен?

  2. Согласно about_Modules, "Только модули, которые хранятся в месте, указанном переменная среды PSModulePath импортируется автоматически». Вы заявили, что добавили свой путь в PSModulePath. Когда я изучаю свой, я вижу, что каждый включенный путь заканчивается обратной косой чертой, поэтому в вашем случае вам понадобится C:\PowerShell\Modules\, а не просто C:\PowerShell\Modules. Какова ценность вашего $env:PsModulePath ?

  3. Согласно этому сообщению Томаса Ли, а также моему собственный опыт, автозагрузка не работает с модулями script; однако вы заявляете, что используете скомпилированный модуль, так что это не должно быть вашей проблемой.

  4. Переменная предпочтения $PSModuleAutoLoadingPreference может использоваться для отключения автозагрузки; однако, если вы не изменили его явно, по умолчанию он равен All, так что, скорее всего, проблема не в этом (about_Preference_Variables показывает возможные значения). Какова ваша ценность $PSModuleAutoLoadingPreference ?

  5. И последнее, но не менее важное: я особенно подозрительно отношусь к тому факту, что вы, похоже, смешиваете оснастки и модули. Это разные типы сущностей, и их нельзя смешивать. Снапины загружаются через Add-PSSnapin. Модули загружаются через Import-Module. И модули, как вы знаете, также загружаются с помощью автозагрузки — я подозреваю, что это может быть не так для кода, написанного как оснастка. Кроме того, оснастки устарели; новый код должен быть написан с использованием модулей (то есть производных от Cmdlet или PSCmdlet, как подробно описано в Написание командлета Windows PowerShell).

person Michael Sorens    schedule 29.05.2014
comment
Спасибо за ответ: 1) Я подтвердил это с помощью get-module, его не было в списке. 2) Да, я дважды проверил это, мой путь заканчивается обратной косой чертой. 3) Все равно спасибо. 4) $PSModuleAutoLoadingPreference не имеет значения, когда я его запрашиваю. 5) Я тоже думаю, что смешиваю понятия. У меня есть несколько классов, унаследованных от PSCmdlet, а также класс SnapIn в моем проекте C#. - person JoanComasFdz; 02.06.2014
comment
Можно автозагрузить модули скриптов - по крайней мере у меня это работает на PS 4 и 5, может в старых версиях не работало. - person Cary; 10.11.2015
comment
Я пробовал все вышеперечисленное, и я все еще получаю автозагрузку первого из вложенных модулей. - person Klas Mellbourn; 25.01.2016
comment
У меня есть две учетные записи пользователей на сервере. В одном из них отсутствие обратной косой черты в $env:PSMODULEPATH было причиной того, что автозагрузка не работала. Однако в другой учетной записи пользователя даже этого было недостаточно, чтобы исправить это. - person Cody Konior; 20.02.2017

Я заметил, что следующая структура не поддерживается PowerShell 4:

Modules\MySnapIn\1.0.0\MySnapIn.psm1

После обновления до версии 5 работает нормально.

person Der_Meister    schedule 23.07.2018

Примечание. Я создаю только модули сценариев, поэтому могу ошибаться.

Автозагрузка модуля PowerShell зависит от обнаружения команды. Я подозреваю, что если вы создаете команды манифеста (New-ModuleManifest) и имени, которые предоставляет ваш двоичный модуль, автозагрузка должна сработать и загрузить модуль, если кто-то попытается использовать одну из этих команд:

New-ModuleManifest -Path MySnappin.psd1 -RootModule MySnappin.dll -CmdletsToExport Get-Foo, Set-Bar
person BartekB    schedule 28.05.2014