PowerShell 5.1 - 如何卸载当前使用的模块

mit*_*mit 16 powershell uninstall powershell-module powershell-5.0

我们在一个部署PowerShell脚本中使用了一些PowerShell模块.使用以下命令,我们将模块(即XXXX)安装到"C:\ Program Files\WindowsPowerShell\Modules"中.

Install-Module -Name "XXXX" -AllowClobber -RequiredVersion "XXXX" -Repository "XXXX" -Scope AllUsers
Run Code Online (Sandbox Code Playgroud)

现在,一旦我们使用了此模块的功能,我们将使用以下命令在部署脚本结束时将其卸载.

Remove-Module -Name "XXXX" -force
Uninstall-Module -Name "XXXX"  -AllVersions -force
Run Code Online (Sandbox Code Playgroud)

但是此卸载模块命令会出现以下错误.

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
Run Code Online (Sandbox Code Playgroud)

有人有任何想法解决这个问题吗?

小智 14

问题可能是您现有的PowerShell会话通过从中加载可能的元素(例如全局变量或常量)来"锁定"模块,即使您正在尝试卸载它(Remove-Module).

确保它未锁定的最简洁方法是退出PowerShell会话.如果你需要保持会话后再做"填充",尝试在使用模块之前启动一个新的PowerShell会话(嵌套会话),然后在结束时退出它.

  • 如果 PowerShell 正在使用该程序包,并且您需要退出 PowerShell 才能将其删除,那么如何在不重新启动 PowerShell 并重新锁定该程序包的情况下运行“Remove-Module”? (10认同)
  • 就我而言,编辑器扩展(VSCode 的 PowerShell)是保留模块引用的罪魁祸首。不要忘记那些。 (6认同)
  • 我的背部疼痛难忍,但这似乎就是原因和解决方案。 (2认同)

Mar*_*łek 14

正如E Bekker原始答案中提到的,模块可能会卡在会话中。关闭 PowerShell 会话并在新会话中运行卸载应该会有所帮助。

处理自动加载

正如Keith 提到的,如果一个模块是自动加载的,它可能会被锁定。如果它是通过配置文件发生的,添加-NoProfile到卸载脚本应该会有所帮助:

powershell -NoProfile -Command "Uninstall-Module X"
Run Code Online (Sandbox Code Playgroud)

一些模块,比如 PSReadLine,即使在这样的会话中也会被加载,并且可能需要额外的-NonInteractive参数:

powershell -NoProfile -NonInteractive -Command "Uninstall-Module X"
Run Code Online (Sandbox Code Playgroud)

我还没有找到这种情况,但如果它仍然没有帮助,可以使用(Get-InstalledModule -Name X).InstalledLocation查找模块安装的位置,并通过其他方式(最后的手段)将其删除。如果模块的另一个/旧版本与 PowerShell 捆绑在一起,最好避免手动删除以免破坏它。

解决方法

  • 也许在这种情况下卸载不是必需的,并且可以安装您的模块,保留它并Update-InstalledModule在需要时更新它?
  • 许多模块无需安装即可导入。Import-Module使用 .psd1 文件的路径可能会起作用。尽管如此,它并没有使Remove-Module工作 100%。
  • 如果担心安全性,可以使用 仅为服务用户安装模块Install-Module -Scope CurrentUser,和/或使用 限制 PowerShell 使用Set-ExecutionPolicy,也可以使用-Scope参数运行。


小智 7

截至 2021 年底,我在 pwsh7.2 和 PSFzf 模块上遇到了同样的问题。对我有用的:

  1. 关闭/强制通过任务管理器关闭 PowerShell/pwsh 的所有实例。
  2. 启动一个没有配置文件的 pwsh 的新实例。赢+R >pwsh -NoProfile
  3. 跑步Uninstall-Module -Name PSfzf -Force


Jon*_*vis 5

就我而言,我是这样解决的:

  1. 关闭 PowerShell。
  2. 真的,关闭PowerShell。打开任务管理器并找到 PowerShell 的任何后台实例,如 powershell.exe / pwsh.exe 中的一个或两个。
  3. 从 C:\Users\${USER}\Documents\PowerShell\Modules 中删除不需要的模块文件夹

  • 真正接近 PowerShell 是这里最重要的事情 (4认同)
  • 我必须从“C:\Program Files\WindowsPowerShell\Modules\<module>\<version>”中删除我的。我认为路径可以从 `(Get-Module -ListAvailable <ThePackageName>).Path` 中计算出来 (2认同)