我正在使用PowerShellGet从我的本地 Nuget 源安装我自己的 PowerShell 模块(按此处打包和发布)。
我像这样安装一次:
Install-Module MyModule -Scope CurrentUser
然后我像这样更新它:
Update-Module MyModule
它按预期工作,但在每次版本更新后,我都会得到模块的副本而不是覆盖:
Get-Module MyModule -ListAvailable
# Output
Directory: C:\Users\user\Documents\WindowsPowerShell\Modules
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 1.0.0.40 MyModule {...}
Manifest 1.0.0.39 MyModule {...}
Manifest 1.0.0.38 MyModule {...}
在最新版本中删除的函数仍然可用,并且 PowerShell ISE 自动完成显示每个函数的重复项:
更新
@CmdrTchort 提出了额外的调查检查,这里是结果。
检查模块的安装位置
Get-Module -Name MyModule -ListAvailable | %{ $_.ModuleBase }
正如预期的那样,PowerShellGet 将它们安装到%USERPROFILE%\Documents\WindowsPowerShell\Modules
:
C:\Users\user\Documents\WindowsPowerShell\Modules\MyModule\1.0.1.1
C:\Users\user\Documents\WindowsPowerShell\Modules\MyModule\1.0.0.40
C:\Users\user\Documents\WindowsPowerShell\Modules\MyModule\1.0.0.39
C:\Users\user\Documents\WindowsPowerShell\Modules\MyModule\1.0.0.38
我看到它$PSScriptRoot
包含那条路径。
检查更新模块将做什么
Update-Module -Name MyModule -WhatIf
# Result
# What if: Performing the operation "Update-Module" on target "Version '1.0.1.1' of module 'MyModule', updating to version '1.0.1.2'".
检查,实际导入的是哪个版本:
- 启动新
powershell
控制台 - 运行
Get-Module
以确保 MyModule 根本没有导入 - 从 MyModule 运行任何 cmdlet
Get-Module
检查,通过再次执行只导入了一个最新版本的 MyModule
对我来说是:
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 1.0.1.2 MyModule {...
结论
看来,这里没有问题,正如@CmdrTchort 所写,预计会Get-Module -ListAvailable
显示安装的所有版本。
我认为 PowerShell 自动完成在 powershell 和 powershell_ise 中的行为有点令人困惑,因为如果可用的版本很少并且从最新版本中删除了功能,它会显示相同功能的重复,可能会很快改变或以某种方式配置。