为什么当我将 -MaximumVersion 设置为较低版本时,较新版本的 PowerShell 模块 运行?

Why does a newer version of the PowerShell module run when I import with -MaximumVersion set to a lower version?

我有一个构建脚本依赖于我们其中一个模块的旧版本。版本 1.0.1。我在 Import-Module 命令中添加了 -MaximumVersion 1.0.1。当构建脚本运行时失败,错误显示它是模块 2.1.0 版本中的 运行 代码。

Import-Module DrilQuip.Build -MaximumVersion 1.0.1 -Force

正在创建下一个版本号... 在此对象上找不到 属性 'VersionFilePath'。验证 属性 存在。 在 C:\Users\svcTFSBuildProd\Documents\WindowsPowerShell\Modules\DrilQuip.Build\ 2.1.0\DrilQuip.Build.psm1:253 char:5

我试过使用和不使用 -Force 开关,但这没有区别。

我使用 Get-Module DrilQuip.Build -ListAvailable 确认计算机上存在版本 1.0.1

如何确保脚本导入并使用旧版本的模块?

更新 1

添加了 -Verbose 开关以获取有关正在发生的事情的更多详细信息。以下是结果:

VERBOSE:正在从路径 'C:\Program 加载模块 Files\WindowsPowerShell\Modules\DrilQuip.Build.0.1\DrilQuip.Build.psd1'。 详细:为模块填充 RepositorySourceLocation 属性 DrilQuip.Build.

正在创建下一个版本号... 在此对象上找不到 属性 'VersionFilePath'。验证 属性 存在。 在 C:\Users\svcTFSBuildProd\Documents\WindowsPowerShell\Modules\DrilQuip.Build\ 2.1.0\DrilQuip.Build.psm1:253char:5 + $Matches = Select-String -Path $global:BuildConfig.VersionFilePat ...

这表明同一模块已安装到 2 个不同的位置。位置 C:\Users\svcTFSBuildProd... 似乎胜过位置 C:\Program Files\WindowsPowerShell...

我认为这与模块安装上的机器与用户范围有关。我将返回并删除用户范围的模块并安装具有机器范围的模块的所有版本,看看是否有帮助。

更新 2

我从用户范围文件夹中删除了模块的所有版本,然后再次尝试脚本。它仍然失败,但现在模块的两个版本都来自相同的模块文件夹位置。

VERBOSE:正在从路径 'C:\Program 加载模块 Files\WindowsPowerShell\Modules\DrilQuip.Build.0.1\DrilQuip.Build.psd1'。 详细:为模块填充 RepositorySourceLocation 属性 DrilQuip.Build。 正在创建下一个版本号... 在此对象上找不到 属性 'VersionFilePath'。验证 属性 存在。 在 C:\Program Files\WindowsPowerShell\Modules\DrilQuip.Build.0.4\DrilQuip.Build.psm1:251 char:5

由于新版本仍然胜过最高版本,我要求我的理论用户范围胜过机器范围不是真正的问题。其他事情正在发生。

我再次 运行 Get-Module -Name DrilQuip.Build -ListAvailable 并且我注意到 ModuleType 不同。在版本 1.0.1 上类型是 Manifest 但在版本 1.1.12.0.4类型是Script。可能是这种差异导致了问题。

ModuleType Version    Name          
---------- -------    ----          
Script     2.0.4      DrilQuip.Build
Script     1.1.1      DrilQuip.Build
Manifest   1.0.1      DrilQuip.Build

我将删除所有模块并从存储库中重新安装它们。

模块 1.0.1 的旧版本具有类型 Manifest 并且之后的所有版本都是类型 脚本。模块 1.0.2 的下一个版本也与我的构建脚本兼容,所以我将 -MaximumVersion 参数更改为 1.0.2 .

在尝试之前,我还卸载了计算机上模块的所有版本,然后只安装了版本 1.0.22.1.0 是真正需要的。我 运行 PowerShell 作为管理员,所以两个模块都安装到文件夹 C:\Program Files\WindowsPowerShell\Modules

PS C:\Program Files\WindowsPowerShell\Modules\DrilQuip.Build> get-module DrilQuip.Build -li

    Directory: C:\Program Files\WindowsPowerShell\Modules
ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     2.1.0      DrilQuip.Build                      {Start-Build, Write-FileCopyResult, Invoke-MSBuild, New-Da...
Script     1.0.2      DrilQuip.Build                      {Get-NextVersion, Set-TfsWorkspaceFileTime}

经过这些更改后,构建脚本可以正常工作并按预期使用代码的 1.0.2 版本。

VERBOSE: Loading module from path 'C:\Program 
Files\WindowsPowerShell\Modules\DrilQuip.Build.0.2\DrilQuip.Build.psd1'.
VERBOSE: Populating RepositorySourceLocation property for module 
DrilQuip.Build.
VERBOSE: Loading module from path 'C:\Program 
Files\WindowsPowerShell\Modules\DrilQuip.Build.0.2\DrilQuip.Build.psm1'.
VERBOSE: Importing function 'Get-NextVersion'.
VERBOSE: Importing function 'Set-TfsWorkspaceFileTime'.

Creating next version number...
New version: 10.2.10928.11004

根据 mklement0 的评论,似乎整个问题是版本 1.0.1 没有正确设置,因此没有导入任何函数。 Import-Module 的详细输出证实了这一点。当脚本调用 Get-NextVersion 函数时,PowerShell 使用模块自动加载来查找并加载确实具有该函数的模块版本。

版本 1.0.1 在清单中缺少 RootModule 的值。该错误已在 1.0.2 版中修复。该模块使用 Export-ModuleMember 来导出函数,而不是清单中的 FunctionsToExport 设置。由于 1.0.1 没有将根模块设置为 psm1 文件,因此无法导出函数..