导入模块仅在从 Get-Module 通过管道传输时才有效



我写了一个简单的PowerShell模块。我需要保留该模块的更多版本。

版本的所有路径都将添加到$env:PSModulePath中。将模块导入会话时遇到奇怪的问题。

此操作失败:

Import-Module Contoso.PowerShell -RequiredVersion "0.0.2"
导入模块:版本为"0.0.2"的指定模块"Contoso.PowerShell" 未加载,因为在任何模块目录中都找不到有效的模块文件。 行:1 字符:1 + import-module contoso.PowerShell -必需版本 "0.0.2" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ResourceUnavailable: (Contoso.PowerShell:String) [import-Module], FileNotFoundException + 完全限定错误 ID : Modules_ModuleWithVersionNotFound,Microsoft.PowerShell.Command.ImportModuleCommand

现在奇怪的事情 - 存在"0.0.2"版本的模块。我可以成功地列出它(带有Get-Module -ListAvailable)。我什至可以导入它并使用它,但唯一的方法是:

Get-Module Contoso.PowerShell -ListAvailable |
? { $_.Version -eq "0.0.2" } |
Import-Module

那么一切都像魅力一样工作。问题是:为什么?我希望能够使用第一个简单的命令导入模块。

编辑:

以下是我存储模块版本的方式:

Get-Module Contoso.PowerShell -ListAvailable
目录: C:\Program Files\WindowsPowerShell\Modules\Contoso.PowerShell\Contoso.PowerShell.0.0.1 模块类型版本名称导出命令 ---------- -------    ----                                ---------------- 脚本 0.0.1 Contoso.PowerShell 目录: C:\Program Files\WindowsPowerShell\Modules\Contoso.PowerShell\Contoso.PowerShell.0.0.2 模块类型版本名称导出命令 ---------- -------    ----                                ---------------- 脚本 0.0.2 Contoso.PowerShell

很抱歉造成混淆 - 我没有 PSModulePath 环境变量中每个版本的路径。

Import-Module工作的原因是因为它使用了不同的参数集;它接受一个或多个[PSModuleInfo]对象,这是Get-Module返回的对象。

很可能,它使用Get-Module已经完成的工作来确定要加载的文件。

接下来的问题是"为什么Import-Module没有像Get-Module那样找到版本?"答案是"我不知道"。

虽然它们在任何情况下都应该保持一致,但麻烦的可能原因是您的直接结构。您如何存储多个版本?

在我看来,您的模块路径不正确。

您的结构应该是:

Contoso.PowerShell.0.2
Contoso.PowerShell.0.3

等。

模块文件直接位于版本号文件夹中,并且不应在其中另外包含名称。

您可以通过使用Install-Module从存储库安装一个并查看它如何处理它来查看此结构。

相关内容

最新更新