PowerShell模块清单 - 自动加载所需模块

And*_*der 8 powershell powershell-module

我正在创建一个模块,该模块依赖于我需要加载到全局环境中的其他几个模块.我尝试创建一个脚本并使用ScriptsToProcess导入模块,但看起来在ScriptstoProcess运行之前检查RequiredModules.

在模块清单中是否有一个很好的,干净的方法来同时需要一个模块并在它尚未加载时自动加载它?如果无法加载模块,则RequiredModule将抛出错误.

小智 9

PowerShell V3的工作方式有所不同.现在,在加载指定了该键的清单时,将加载所需的模块.此外,无论该模块如何加载,删除模块都不会卸载所需的模块.有趣的是,-Force似乎没有显示所需模块的自动加载.


编辑:如果您的模块不在默认位置之一,则需要将该模块的路径(或模块所在的父文件夹)添加到$env:PSModulePath变量中.


旁注:由于PSv3 #Requires脚本中支持该命令.您可以使用此方法(1)尝试在脚本中加载模块依赖项,(2)如果模块未加载/无法加载则终止.

#Requires -Modules ModuleName1,ModuleName2
Run Code Online (Sandbox Code Playgroud)

这也需要模块位于其下$env:PSModulePath,必须运行脚本之前设置.


Jay*_*kul 8

在PowerShell 3及更高版本中,自动加载RequiredModules

如果您要分发模块,这也是确保人们使用PowerShellGet(即PowerShell Gallery)安装依赖项的唯一方法.

如果缺少所需的模块,它仍然会失败,但是否则会按照您希望的方式完成.

在PowerShell 2中,无法自动加载RequiredModules

在任何一种情况下,用户都可以通过键入来手动加载需求Import-Module RequiredModule, YourModule- 如果已经导入,他们将不会获得第二个实例...

您也可以在NestedModules中指定模块.即使在PowerShell 2中,这些也会被"加载"到您的模块内部,但是当它们已经加载时似乎不会对资源产生负面影响.但是,正如@JasonMArcher提醒我的那样,在PowerShell 2中,如果你的模块被卸载(通过Remove-Module),NestedModules会随你的模块一起卸载,即使它们是由用户单独预加载的,也会发生这种情况,最终可能会由于您的用户不会期望,因此会生成非常奇怪的错误报告.

另一个适用于所有PowerShell版本的选项是Import-Module在模块顶部调用(在检查以确保模块尚未加载之后的psm1脚本中),-ErrorAction Stop以便模块的导入失败如果依赖模块的导入失败.

if (!(Get-Module Dependency)) { ## Or check for the cmdlets you need
    ## Load it nested, and we'll automatically remove it during clean up
    Import-Module Dependency -ErrorAction Stop
}
Run Code Online (Sandbox Code Playgroud)

实际上,如果你想检查版本......

if (!(Get-Module Dependency | Where { $_.Version -ge "2.5" )) { 
    ## Load version 2.5 (or newer), or die 
    Import-Module Dependency -Version 2.5 -ErrorAction Stop
}
Run Code Online (Sandbox Code Playgroud)

请记住,这不作为文档,因此如果您分发模块,您的用户将不会知道依赖项.

  • 但是,如果删除了模块,嵌套模块将被删除. (2认同)