4

我正在使用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

我在Visual Studio 2012中开发了一个针对.NET Framework 4的C#项目,其中包含一些和. 我可以调试它们,一切正常。CmdletSnapin

我已经创建了路径C:\PowerShell\Modules\并将其添加到PSModulePath环境变量中。

我把 rMySnapIn.dll放到了 pathC:\PowerShell\Modules\MySnapIn上。

我希望模块会自动加载,因此我可以使用新的 cmdlet,但它们不是:模块未加载。我必须写Import-Module MySnapin才能加载它。

如何让模块自动加载?

4

4 回答 4

17

可以帮助您识别问题的清单:

  1. 根据Windows PowerShell 中的新增功能,“模块的自动导入由以下方式触发:(a) 在命令中使用 cmdlet,(b) 为不带通配符的 cmdlet 运行 Get-Command,或 (C) 为 cmdlet 运行 Get-Help没有通配符。” (这适用于 V3 和 V4。)您如何确认模块没有加载?

  2. 根据about_Modules,“只有存储在 PSModulePath 环境变量指定位置的模块才会自动导入。” 您说您确实将路径添加到 PSModulePath。当我检查我的时,我看到包含的每个路径都以反斜杠终止,所以在你的情况下,你需要C:\PowerShell\Modules\而不是仅仅C:\PowerShell\Modules. 你的价值是$env:PsModulePath多少?

  3. 根据Thomas Lee 的这篇文章以及我自己的经验,自动加载不适用于脚本模块;但是,您声明您正在使用已编译的模块,所以这不应该是您的问题。

  4. $PSModuleAutoLoadingPreference选项变量可用于关闭自动加载;但是,除非您已明确更改它,否则默认情况下All这很可能不是问题(about_Preference_Variables向您显示可能的值)。你的价值是$PSModuleAutoLoadingPreference多少?

  5. 最后但并非最不重要的一点——我特别怀疑你似乎在混合管理单元和模块这一事实。它们是不同类型的实体,并非旨在混合使用。管理单元通过Add-PSSnapin. 模块通过Import-Module. 如您所知,模块也是通过自动加载来加载的——我怀疑编写为管理单元的代码可能并非如此。此外,管理单元已被弃用;新代码应使用模块编写(即从Cmdlet或派生PSCmdlet,如编写 Windows PowerShell Cmdlet中所述)。

于 2014-05-29T20:38:48.043 回答
5

如果您想自动加载它,您可以将Import-Module MySnapin命令行添加到您的PowerShell 配置文件中。

要查找 PowerShell 配置文件的位置,只需输入$profilePowerShell,默认情况下配置文件路径为:

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

如果Microsoft.PowerShell_profile.ps1文件不存在,只需创建它。

于 2014-05-28T11:06:18.413 回答
3

我注意到 PowerShell 4 不支持以下结构:

Modules\MySnapIn\1.0.0\MySnapIn.psm1

更新到版本 5 后工作正常。

于 2018-07-23T04:52:43.210 回答
1

注意:我只编写脚本模块,所以我可能错了。

PowerShell 模块自动加载取决于命令发现。我怀疑如果您创建New-ModuleManifest二进制模块公开的清单 () 和命名命令,如果有人尝试使用以下命令之一,自动加载应该启动并加载模块:

New-ModuleManifest -Path MySnappin.psd1 -RootModule MySnappin.dll -CmdletsToExport Get-Foo, Set-Bar
于 2014-05-28T11:57:10.320 回答