Powershell v4不自动导入模块
本文关键字:导入 模块 v4 Powershell | 更新日期: 2023-09-27 18:05:36
我使用的是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
和Snapin
。我可以调试它们,一切都很好。
我已经创建了路径C:'PowerShell'Modules'
并将其添加到PSModulePath
环境变量中。
我把r MySnapIn.dll
放到路径C:'PowerShell'Modules'MySnapIn
。
我希望模块是自动加载的,这样我就有了新的cmdlet可以使用,但是它们没有:模块没有加载。我必须写Import-Module MySnapin
来加载它。
如何让模块自动加载?
可以帮助您识别问题的清单:
-
根据Windows PowerShell的新功能,"自动导入模块是通过(a)在命令中使用cmdlet, (b)对不带通配符的cmdlet运行Get-Command,或(C)对不带通配符的cmdlet运行Get-Help触发的。"(这适用于V3和V4。)你怎么确认模块没有被加载?
-
根据about_Modules,"只有存储在PSModulePath环境变量指定位置的模块才会被自动导入。"您说您确实将您的路径添加到PSModulePath。当我检查我的路径时,我看到包含的每个路径都以反斜杠结束,所以在您的情况下,您需要
C:'PowerShell'Modules'
而不仅仅是C:'PowerShell'Modules
。你的$env:PsModulePath
的值是多少? -
根据Thomas Lee的这篇文章以及我自己的经验,自动加载不与脚本模块一起工作;但是,您声明您正在使用编译的模块,因此这应该不是您的问题。
-
$PSModuleAutoLoadingPreference
偏好变量可用于关闭自动加载;但是,除非您显式地更改它,否则它的默认值为All
,因此很可能不是问题(about_Preference_Variables显示了可能的值)。你的$PSModuleAutoLoadingPreference
值是多少? -
最后但并非最不重要的——我对你似乎混合了snapins和模块的事实特别怀疑。它们是不同类型的实体,并不是为了混合而设计的。Snapins通过
Add-PSSnapin
加载。模块通过Import-Module
加载。正如您所知,模块也是通过自动加载加载的——我怀疑作为snapin编写的代码可能不是这样。此外,不赞成使用snapins;新代码应该使用模块编写(也就是说,从Cmdlet
或PSCmdlet
派生,详见编写Windows PowerShell Cmdlet)。
如果你想自动加载它,你可以将Import-Module MySnapin
命令行添加到你的PowerShell配置文件中。
$profile
,默认配置文件路径为:
C:'Documents and Settings'User'My Documents'WindowsPowerShell'Microsoft.PowerShell_profile.ps1
如果Microsoft.PowerShell_profile.ps1
文件不存在,直接创建
我注意到PowerShell 4不支持以下结构:
Modules'MySnapIn'1.0.0'MySnapIn.psm1
注意:我只创作脚本模块,所以我可能是错的。
PowerShell模块自动加载依赖于命令发现。我怀疑,如果您创建manifest (New-ModuleManifest
)和名称命令,您的二进制模块暴露,自动加载应该启动和加载模块,如果有人试图使用这些命令之一:
New-ModuleManifest -Path MySnappin.psd1 -RootModule MySnappin.dll -CmdletsToExport Get-Foo, Set-Bar