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
Файл не существует, просто создайте его.
Контрольный список, который может помочь вам определить проблему:
Согласно разделу "Что нового в Windows PowerShell": "Автоматический импорт модулей запускается с помощью (a) использования командлета в команде, (b) запуска команды Get-Command для командлета без подстановочных знаков или (C) запуска команды Get-Help для командлета без подстановочных знаков." (Это относится к V3 и V4.) Как вы убедились, что модуль не был загружен?
Согласно about_Modules, "автоматически импортируются только модули, которые хранятся в расположении, указанном переменной среды PSModulePath". Вы заявили, что добавили свой путь в PSModulePath. Когда я проверяю мой, я вижу, что каждый включенный путь заканчивается обратной косой чертой, так что в вашем случае вам понадобится
C:\PowerShell\Modules\
а не простоC:\PowerShell\Modules
, Какова ценность вашего$env:PsModulePath
?Согласно этому посту Томаса Ли и моему собственному опыту, автозагрузка не работает с модулями сценариев; однако вы заявляете, что используете скомпилированный модуль, поэтому это не должно быть вашей проблемой.
$PSModuleAutoLoadingPreference
переменная предпочтения может использоваться для отключения автозагрузки; однако, если вы явно не изменили его, по умолчаниюAll
настолько вероятно, что это не проблема ( about_Preference_Variables показывает возможные значения). Какова ваша ценность$PSModuleAutoLoadingPreference
?И последнее, но не менее важное: я особенно подозрительно отношусь к тому факту, что вы, похоже, смешиваете оснастки и модули. Они представляют собой различные типы объектов и не предназначены для смешивания. 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