在将-MaximumVersion设置为较低版本的情况下导入时,为什么运行新版本的PowerShell模块?

时间:2019-02-27 19:08:45

标签: powershell module side-by-side

我有一个构建脚本,该脚本依赖于我们模块之一的较旧版本。版本 1.0.1 。我在-MaximumVersion 1.0.1命令中添加了Import-Module。当构建脚本运行时,它将失败,并显示错误消息,表明该模块的模块版本为 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开关以获取有关正在发生的事情的更多详细信息。结果如下:

详细:从路径' C:\ Program加载模块 Files \ WindowsPowerShell \ Modules \ DrilQuip.Build \ 1.0.1 \ DrilQuip.Build.psd1'。 详细信息:填充模块的RepositorySourceLocation属性 DrilQuip.Build。

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

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

我认为这与模块安装上的“机器与用户”作用域有关。我将返回并删除User作用域的模块,并使用Machine scope安装该模块的所有版本,看看是否有帮助。

更新2

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

详细:从路径' C:\ Program加载模块 Files \ WindowsPowerShell \ Modules \ DrilQuip.Build \ 1.0.1 \ DrilQuip.Build.psd1'。 详细信息:填充模块的RepositorySourceLocation属性 DrilQuip.Build。 正在创建下一个版本号... 在此对象上找不到属性“ VersionFilePath”。验证 属性存在。 在 C:\ Program 文件\ WindowsPowerShell \ Modules \ DrilQuip.Build \ 2.0.4 \ DrilQuip.Build.psm1:251 字符:5

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

我再次运行Get-Module -Name DrilQuip.Build -ListAvailable,我注意到ModuleType是不同的。在版本 1.0.1 上,类型为清单,但是在版本 1.1.1 2.0.4 上,类型为脚本。也许是这种差异导致了问题。

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

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

1 个答案:

答案 0 :(得分:1)

模块旧版本 1.0.1 的类型为清单,此后的所有版本均为 Script 。模块的下一版本 1.0.2 也与我的构建脚本兼容,因此我将-MaximumVersion参数更改为 1.0.2

在尝试之前,我还卸载了计算机上模块的所有版本,然后仅安装了确实需要的版本 1.0.2 2.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\1.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\1.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文件,因此无法导出函数。