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,其中包含一些CmdletSnapin。我可以调试它们,一切都很好。

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

我把r MySnapIn.dll放到路径C:'PowerShell'Modules'MySnapIn

我希望模块是自动加载的,这样我就有了新的cmdlet可以使用,但是它们没有:模块没有加载。我必须写Import-Module MySnapin来加载它。

如何让模块自动加载?

Powershell v4不自动导入模块

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

  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. 最后但并非最不重要的——我对你似乎混合了snapins和模块的事实特别怀疑。它们是不同类型的实体,并不是为了混合而设计的。Snapins通过Add-PSSnapin加载。模块通过Import-Module加载。正如您所知,模块也是通过自动加载加载的——我怀疑作为snapin编写的代码可能不是这样。此外,不赞成使用snapins;新代码应该使用模块编写(也就是说,从CmdletPSCmdlet派生,详见编写Windows PowerShell Cmdlet)。

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

要查找PowerShell配置文件的位置,只需在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