从某些子文件夹中导入PowerShell模块

4
尽管已经有很多关于PowerShell模块导入的问题和博客,但我没有找到回答我的问题的任何内容。
我正在尝试导入组在子文件夹中的模块,而不必将所有这些子文件夹添加到 $env:PSModulePath 中。以下是文件夹结构的示例:
...\WindowsPowerShell\Modules\
...\WindowsPowerShell\Modules\Avengers
...\WindowsPowerShell\Modules\Avengers\ModuleHulk\ModuleHulk.psd1
...\WindowsPowerShell\Modules\Avengers\ModuleThor\ModuleThor.psd1
...\WindowsPowerShell\Modules\X-Men
...\WindowsPowerShell\Modules\X-Men\ModuleProfX\ModuleProfX.psd1
...\WindowsPowerShell\Modules\X-Men\ModuleMagneto\ModuleMagneto.psd1
...\WindowsPowerShell\Modules\FantasticFour
...\WindowsPowerShell\Modules\FantasticFour\ModuleMisterFantastic\ModuleMisterFantastic.psd1
...\WindowsPowerShell\Modules\FantasticFour\ModuleInvisibleWoman\ModuleInvisibleWoman.psd1

根据Microsoft Docs,模块.psd1文件名必须与模块文件夹名称相同,上述已满足。模块必须位于$env:PSModulePath位置,一切正常。不幸的是,PowerShell无法导入这些模块。
PS> Import-Module ModuleHulk
Import-Module : The specified module 'ModuleHulk' was not loaded because no valid module file was found in any module directory.
At line:1 char:1
+ Import-Module ModuleHulk
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (ModuleHulk:String) [Import-Module], FileNotFoundException
    + FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand

PS>

然而,最近我发现一种使用相当新的 using module 语句(自 PowerShell 版本 5 起)来导入模块的方法。为此,我可以在脚本开头添加以下代码,或者在控制台中执行:

#Requires -Version 5
using module ModuleHulk

PS> using module ModuleHulk
PS>

没有问题,一切都好,所以该模块本身很好,并且可以像往常一样导入。但是,这似乎是一个hacky解决方案,它需要至少PowerShell 5。现在的问题是:

有没有办法使用通常的Import-Module命令,而不必将所有子文件夹添加到$env:PSModulePath中来实现此目的?


1
是的 - 不要把它们放在子文件夹中,而是将它们放在根目录中。 - Scepticalist
1
是的,那是一种可行的方法,但是我有这些模块在一个Git存储库中,如果我克隆它,它将(并且必须)创建一个子文件夹(例如MarvelGit)。现在你可能会说你可以直接克隆到Modules文件夹中,但是如果你想克隆另一个Git存储库呢? - dwettstein
导入模块 (($Env:PSModulePath -split ';') | gci -R -Fi ModuleHulk -At Directory).FullName - leeharvey1
1个回答

0
我在另一个SO问题的帮助下找到了一个可能的解决方案:Import-Module works only when piped from Get-ModuleImport-Module cmdlet 还接受一个或多个 [PSModuleInfo] 对象,这是 Get-Module 返回的内容。因此,可以执行以下操作:
Get-Module ModuleHulk -ListAvailable | Import-Module

PS> Get-Module ModuleHulk -ListAvailable

    Directory: ...\WindowsPowerShell\Modules\Avengers\

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   1.0.0      ModuleHulk

PS> Get-Module ModuleHulk -ListAvailable | Import-Module
PS> Get-Module ModuleHulk

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   1.0.0      ModuleHulk                          {...}

PS>

太好了!如果有人知道为什么Get-Module命令以不同的方式查找模块而不是Import-Module,请告诉我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接