Powershell v4不会自动导入模块

时间:2014-05-28 10:57:43

标签: c# powershell module load powershell-v4.0

我正在使用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 中开发了一个 C#项目,目标是 .NET Framework 4 ,其中包含一些Cmdlet和{ {1}}。我可以调试它们,一切正常。

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

我将r PSModulePath放到路径MySnapIn.dll

我希望模块能够自动加载,因此我可以使用新的cmdlet,但它们不是:模块未加载。我必须写C:\PowerShell\Modules\MySnapIn才能加载它。

如何自动加载模块?

4 个答案:

答案 0 :(得分:16)

可帮助您确定问题的清单:

  1. 根据What's New in 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的this post以及我自己的经验,自动加载确实 脚本模块一起工作;但是,你说你正在使用编译的模块,所以这不应该是你的问题。

  4. $PSModuleAutoLoadingPreference首选项变量可用于关闭自动加载功能;但是,除非您明确更改了它,否则默认为All,这可能不是问题(about_Preference_Variables显示可能的值)。您对$PSModuleAutoLoadingPreference的价值是什么?

  5. 最后但并非最不重要 - 我特别怀疑你似乎在混合snapins和模块。它们是不同类型的实体,并非设计为混合。 Snapins通过Add-PSSnapin加载。模块通过Import-Module加载。如你所知,模块也是通过自动加载加载的 - 我怀疑编写为snapin的代码可能不正确。此外,不推荐使用snapins;新代码应使用模块编写(即,源自CmdletPSCmdlet,详见Writing a Windows PowerShell Cmdlet)。

答案 1 :(得分:4)

如果您想自动加载它,可以将Import-Module MySnapin命令行添加到PowerShell profile

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

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

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

答案 2 :(得分:1)

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

Modules\MySnapIn\1.0.0\MySnapIn.psm1

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

答案 3 :(得分:0)

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

PowerShell模块自动加载取决于命令发现。我怀疑如果你创建了二进制模块暴露的清单(New-ModuleManifest)和命令命令,那么如果有人试图使用其中一个命令,自动加载应该启动并加载模块:

New-ModuleManifest -Path MySnappin.psd1 -RootModule MySnappin.dll -CmdletsToExport Get-Foo, Set-Bar