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的升级

如何卸载win10系统自带程序

Powershell:通过 UpgradeCode 卸载应用程序

如何在不卸载powershell的情况下,有效禁用/启用powershel