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
我在Visual Studio 2012中开发了一个针对.NET Framework 4的C#项目,其中包含一些Cmdlet
和Snapin
。 我可以调试它们,一切正常。
我创建了路径C:\PowerShell\Modules\
并将其添加到PSModulePath
环境变量中。
我把r MySnapIn.dll
放到路径C:\PowerShell\Modules\MySnapIn
。
我希望模块能够自动加载,因此我可以使用新的cmdlet,但它们不是:模块未加载。 我必须编写Import-Module MySnapin
才能加载它。
如何自动加载模块?
如果要自动加载它,可以将Import-Module MySnapin
命令行添加到PowerShell配置文件中 。
要查找PowerShell配置文件的位置,只需在PowerShell中键入$profile
,默认情况下,配置文件路径为:
C:\Documents and Settings\User\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
如果Microsoft.PowerShell_profile.ps1
文件不存在,则只需创建它。
可帮助您确定问题的清单:
-
根据Windows PowerShell中的新增function ,“(a)在命令中使用cmdlet,(b)为没有通配符的cmdlet运行Get-Command,或(C)为cmdlet运行Get-Help,可以触发模块的自动导入。没有通配符。“ (这适用于V3和V4。)您是如何确认模块未加载的?
-
根据about_Modules ,“只有存储在PSModulePath环境变量指定位置的模块才会被自动导入。” 您声明已添加了PSModulePath的路径。 当我检查我的时,我看到包含的每个路径都以反斜杠结束,所以在你的情况下你需要
C:\PowerShell\Modules\
而不只是C:\PowerShell\Modules
。 你的$env:PsModulePath
的价值是$env:PsModulePath
? -
根据Thomas Lee的这篇文章以及我自己的经验,自动加载不适用于脚本模块; 但是,您声明您正在使用已编译的模块,因此这不应该是您的问题。
-
$PSModuleAutoLoadingPreference
首选项变量可用于关闭自动加载; 但是,除非您已明确更改它,否则默认为All
,这可能不是问题( about_Preference_Variables显示可能的值)。 你对$PSModuleAutoLoadingPreference
的价值是$PSModuleAutoLoadingPreference
? -
最后但并非最不重要 – 我特别怀疑你似乎在混合snapins和模块。 它们是不同类型的实体,并非设计为混合。 通过
Add-PSSnapin
加载Snapins。 模块通过Import-Module
加载。 如你所知,模块也是通过自动加载加载的 – 我怀疑编写为snapin的代码可能不正确。 此外,不推荐使用snapins; 新代码应该使用模块编写(即,从Cmdlet
或PSCmdlet
,如编写Windows PowerShell Cmdlet中所述 )。
我注意到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