首页 > 解决方案 > 从某些子文件夹中导入 PowerShell 模块

问题描述

尽管已经有很多关于 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-Modulecmdlet 来实现这一点,而无需将所有子文件夹添加到$env:PSModulePath?

标签: powershellimport

解决方案


由于另一个 SO 问题,我找到了一种可能的解决方案:Import-Module 仅在从 Get-Module 管道传输时才有效

Import-Modulecmdlet 还接受一个或多个[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-Modulecmdlet 以不同于 的方式找到模块Import-Module,请告诉我。


推荐阅读