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

时间:2017-03-06 13:08:16

标签: powershell uninstall powershell-v5.0 powershell-module

我们在一个部署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

但是这个uninstall module命令会出现以下错误。

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

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

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:6)

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更新模块?
  • 许多模块无需安装即可导入。带有.psd1文件路径的Import-Module可能有效。尽管如此,它并不能使Remove-Module的工作达到100%。
  • 如果出于安全考虑,可以使用Install-Module -Scope CurrentUser仅为服务用户安装模块,和/或使用Set-ExecutionPolicy限制PowerShell的使用,可以使用-Scope参数运行也是。

答案 2 :(得分:1)

对于我来说,我是这样解决的:

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