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 переменная окружения.

Я положил гMySnapIn.dll к пути C:\PowerShell\Modules\MySnapIn,

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

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

4 ответа

Решение

Если вы хотите загрузить его автоматически, вы можете добавить Import-Module MySnapin Командная строка для вашего профиля PowerShell.

Чтобы узнать местоположение вашего профиля PowerShell, просто введите $profileв PowerShell и по умолчанию путь к профилю:

C:\Documents and Settings\User\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

Если Microsoft.PowerShell_profile.ps1 Файл не существует, просто создайте его.

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

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

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

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

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

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

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

Modules\MySnapIn\1.0.0\MySnapIn.psm1

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

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

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

New-ModuleManifest -Path MySnappin.psd1 -RootModule MySnappin.dll -CmdletsToExport Get-Foo, Set-Bar
Другие вопросы по тегам