powershell - 从某些子文件夹中导入 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-Module
cmdlet 来实现这一点,而无需将所有子文件夹添加到$env:PSModulePath
?
解决方案
由于另一个 SO 问题,我找到了一种可能的解决方案:Import-Module 仅在从 Get-Module 管道传输时才有效。
该Import-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
cmdlet 以不同于 的方式找到模块Import-Module
,请告诉我。
推荐阅读
- java - Thymeleaf 多文件输入在未选择任何内容时发送空文件
- visual-studio-2017 - 在 Visual Studio 2017 中是否有用于切换垂直拆分编辑器窗口的子窗格的命令/热键?
- twitter-bootstrap - Bootstrap navbar-toggle 带有标签的汉堡图标
- python-3.6 - numpy argsort 产生类型错误:只有整数标量数组可以转换为标量索引
- sql-server - Query Store 站在哪里,它在哪里存储执行计划、运行时统计信息?
- python - Pandas:如果字符串列表中不存在字符串,则将其替换为“其他”
- asp.net-mvc - 如何在打字稿项目中集成信号器?
- javascript - 我有一个 TextInput,如何只启用小于 9999.99 的数字?
- php - 从文件中删除特定行
- reporting-services - SQL Server Reporting Services 表达式 BackgroundColour 基于 DateDiff