PowerShell 5.1 - 如何卸载当前使用的模块
Posted
技术标签:
【中文标题】PowerShell 5.1 - 如何卸载当前使用的模块【英文标题】:PowerShell 5.1 - How to uninstall module which is currently use 【发布时间】:2017-07-26 08:56:45 【问题描述】:我们在一个部署 PowerShell 脚本中使用了一些 PowerShell 模块。使用以下命令,我们将模块(即 XXXX)安装到“C:\Program Files\WindowsPowerShell\Modules”中。
Install-Module -Name "XXXX" -AllowClobber -RequiredVersion "XXXX" -Repository "XXXX" -Scope AllUsers
现在,一旦我们使用了这个模块的功能,我们会在部署脚本结束时使用以下命令将其卸载。
Remove-Module -Name "XXXX" -force
Uninstall-Module -Name "XXXX" -AllVersions -force
但是这个卸载模块命令给出了以下错误。
WARNING: The version '###' of module 'XXXX' is currently in use. Retry the operation after closing the
applications.
PackageManagement\Uninstall-Package : Module 'XXXX' is in currently in use.
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:2046 char:21
+ ... $null = PackageManagement\Uninstall-Package @PSBoundParameters
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (Microsoft.Power...ninstallPackage:UninstallPackage) [Uninstall-Packag
e], Exception
+ FullyQualifiedErrorId : ModuleIsInUse,Uninstall-Package,Microsoft.PowerShell.PackageManagement.Cmdlets.Uninstall
Package
有人有办法解决这个问题吗?
【问题讨论】:
找到解决方案了吗? 【参考方案1】:问题可能是您现有的 PowerShell 会话通过从中加载可能的元素(例如全局变量或常量)来“锁定”模块,即使您尝试卸载它 (Remove-Module
)。
确保它没有被锁定的最简单方法是退出 PowerShell 会话。如果您需要保留会话以在之后做“事情”,请尝试在使用模块之前启动一个新的 PowerShell 会话(嵌套会话),然后在最后退出它。
【讨论】:
我后背的皇家疼痛,但这似乎是原因和解决方案。 如果 PowerShell 正在使用该包,并且您需要退出 PowerShell 以将其删除,那么如何在不重新启动 PowerShell 并重新锁定该包的情况下运行Remove-Module
?
使用不同的控制台,如 windows cmd-prompt(例如)通常在 powershell 锁定某些模块时起作用。
就我而言,编辑器扩展(VSCode 的 PowerShell)是保留模块引用的罪魁祸首。不要忘记那些。【参考方案2】:
如original answer by E Bekker 中所述,模块可能会卡在会话中。 关闭 PowerShell 会话并在新会话中运行卸载应该会有所帮助。
处理自动加载
作为Keith mentioned,如果模块被自动加载,它可能会被锁定。如果它通过配置文件发生,将-NoProfile
添加到卸载脚本应该会有所帮助:
powershell -NoProfile -Command "Uninstall-Module X"
某些模块,例如 PSReadLine,即使在此类会话中也会被加载,并且可能需要额外的 -NonInteractive
参数:
powershell -NoProfile -NonInteractive -Command "Uninstall-Module X"
我还没有找到这种情况,但如果仍然没有帮助,可以使用(Get-InstalledModule -Name X).InstalledLocation
查找模块的安装位置,并通过其他方式将其删除(最后的手段)。如果另一个/旧版本的模块与 PowerShell 捆绑在一起,最好避免手动删除以免破坏它。
解决方法
也许在这种情况下不需要卸载,并且可以安装、保留它并在需要时使用Update-InstalledModule
更新它?
许多模块无需安装即可导入。 Import-Module
与 .psd1 文件的路径可能会起作用。尽管如此,它并没有让Remove-Module
100% 工作。
如果担心安全问题,可以使用Install-Module -Scope CurrentUser
仅为服务用户安装模块,和/或使用Set-ExecutionPolicy
限制PowerShell 的使用,也可以使用-Scope
参数运行。
【讨论】:
【参考方案3】:就我而言,我是这样解决的:
-
关闭 PowerShell。
真的,关闭 PowerShell。打开任务管理器并找到 PowerShell 的任何后台实例,如 powershell.exe / pwsh.exe 中的一个或两个。
从 C:\Users\$USER\Documents\PowerShell\Modules 中删除不需要的模块文件夹
【讨论】:
真正关闭PowerShell在这里是最重要的 我不得不从C:\Program Files\WindowsPowerShell\Modules\<module>\<version>
中删除我的。我认为路径可以从(Get-Module -ListAvailable <ThePackageName>).Path
对于那些启用强制云同步到一个驱动器的路径是; %OneDrive%/Documents/WindowsPowerShell/Modules【参考方案4】:
截至 2021 年底,我在使用 pwsh7.2 和 PSFzf 模块时遇到了同样的问题。 什么对我有用:
-
关闭/强制通过任务管理器关闭所有 PowerShell/pwsh 实例。
在没有配置文件的情况下启动新的 pwsh 实例。 Win+R >
pwsh -NoProfile
运行Uninstall-Module -Name PSfzf -Force
【讨论】:
以上是关于PowerShell 5.1 - 如何卸载当前使用的模块的主要内容,如果未能解决你的问题,请参考以下文章
PowerShell如何实现Desktop版本到5.1的升级
PowerShell如何实现Desktop版本到5.1的升级
PowerShell如何实现Desktop版本到5.1的升级