PowerShell模块清单-自动加载所需模块
我正在创建一个模块,它依赖于我需要加载到全局环境中的其他几个模块。我尝试创建一个脚本并使用ScriptStopProcess导入模块,但似乎在ScriptStopProcess运行之前检查了RequiredModule 在模块清单中是否有一种好的、干净的方法,既需要一个模块,又在尚未加载模块时自动加载它?如果无法加载模块,则RequiredModule将抛出错误。在PowerShell 3及更高版本中,RequiredModule将自动加载 如果要分发模块,这也是确保使用PowerShellGet(即)的用户安装依赖项的唯一方法 如果缺少所需的模块,它仍然会失败,但在其他方面,它的工作方式与您希望的完全相同 在PowerShell 2中,无法自动加载所需的模块 在这两种情况下,用户都可以通过键入导入模块RequiredModule,YourModule来手动加载需求—如果已经导入了第二个实例,他们将不会获得第二个实例 也可以在NestedModules中指定模块。即使在PowerShell 2中,这些资源也会“在”您的模块中加载,但在已经加载资源时,它们似乎不会对资源产生负面影响。然而,正如@JasonMArcher提醒我的那样,在PowerShell 2中,如果您的模块被卸载(通过Remove module),则NestedModule会与您的模块一起卸载,即使用户单独预加载了这些模块,也会发生这种情况,这可能会导致非常奇怪的错误报告,因为您的用户不会预料到这一点 另一个选项,适用于所有版本的PowerShell,即调用模块顶部的PowerShell模块清单-自动加载所需模块,powershell,powershell-module,Powershell,Powershell Module,我正在创建一个模块,它依赖于我需要加载到全局环境中的其他几个模块。我尝试创建一个脚本并使用ScriptStopProcess导入模块,但似乎在ScriptStopProcess运行之前检查了RequiredModule 在模块清单中是否有一种好的、干净的方法,既需要一个模块,又在尚未加载模块时自动加载它?如果无法加载模块,则RequiredModule将抛出错误。在PowerShell 3及更高版本中,RequiredModule将自动加载 如果要分发模块,这也是确保使用PowerShellGe
导入模块
(在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
}
事实上,如果你想检查版本
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
}
请记住,这不是文档,因此如果分发模块,用户将不知道依赖关系。PowerShell V3的工作方式有所不同。现在,当您加载具有指定键的清单时,将加载所需的模块。此外,移除模块不会卸载所需的模块,无论该模块是如何加载的。有趣的是,-Force似乎没有显示所需模块的自动加载
编辑:如果模块不在默认位置之一,则需要将该模块的路径(或模块所在的父文件夹)添加到
$env:PSModulePath
变量中
旁注:自PSv3以来,支持脚本中的
#Requires
命令。您可以使用此选项来(1)尝试在脚本中加载模块依赖项,(2)在模块未加载/无法加载时终止
#Requires -Modules ModuleName1,ModuleName2
这还需要模块位于$env:PSModulePath
下的某个位置,在运行脚本之前必须设置
$env:PSModulePath
中的一个路径下,否则PowerShell将找不到所需的模块。