Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PowerShell模块清单-自动加载所需模块_Powershell_Powershell Module - Fatal编程技术网

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

PowerShell模块清单-自动加载所需模块,powershell,powershell-module,Powershell,Powershell Module,我正在创建一个模块,它依赖于我需要加载到全局环境中的其他几个模块。我尝试创建一个脚本并使用ScriptStopProcess导入模块,但似乎在ScriptStopProcess运行之前检查了RequiredModule 在模块清单中是否有一种好的、干净的方法,既需要一个模块,又在尚未加载模块时自动加载它?如果无法加载模块,则RequiredModule将抛出错误。在PowerShell 3及更高版本中,RequiredModule将自动加载 如果要分发模块,这也是确保使用PowerShellGe

我正在创建一个模块,它依赖于我需要加载到全局环境中的其他几个模块。我尝试创建一个脚本并使用ScriptStopProcess导入模块,但似乎在ScriptStopProcess运行之前检查了RequiredModule

在模块清单中是否有一种好的、干净的方法,既需要一个模块,又在尚未加载模块时自动加载它?如果无法加载模块,则RequiredModule将抛出错误。

在PowerShell 3及更高版本中,RequiredModule将自动加载 如果要分发模块,这也是确保使用PowerShellGet(即)的用户安装依赖项的唯一方法

如果缺少所需的模块,它仍然会失败,但在其他方面,它的工作方式与您希望的完全相同

在PowerShell 2中,无法自动加载所需的模块 在这两种情况下,用户都可以通过键入导入模块RequiredModule,YourModule来手动加载需求—如果已经导入了第二个实例,他们将不会获得第二个实例

也可以在NestedModules中指定模块。即使在PowerShell 2中,这些资源也会“在”您的模块中加载,但在已经加载资源时,它们似乎不会对资源产生负面影响。然而,正如@JasonMArcher提醒我的那样,在PowerShell 2中,如果您的模块被卸载(通过Remove module),则NestedModule会与您的模块一起卸载,即使用户单独预加载了这些模块,也会发生这种情况,这可能会导致非常奇怪的错误报告,因为您的用户不会预料到这一点

另一个选项,适用于所有版本的PowerShell,即调用模块顶部的
导入模块
(在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
下的某个位置,在运行脚本之前必须设置


但是如果您的模块被删除,嵌套模块也会被删除。是的,即使它们是在模块加载之前(手动)加载的。可能是一个丑陋的错误。让我添加第二个选项…执行重新导入不会有多大作用,除非您使用-Global标志,否则它会使模块成为嵌套模块。我相信这已经过时了。感谢@jpmc26,我已将其更新为包含版本详细信息。这可能需要模块位于
$env:PSModulePath
中的一个路径下,否则PowerShell将找不到所需的模块。