40

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

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

4

4 回答 4

23

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

确保它没有被锁定的最简单方法是退出 PowerShell 会话。如果您需要保留会话以在之后做“事情”,请尝试在使用模块之前启动一个新的 PowerShell 会话(嵌套会话),然后在最后退出它。

于 2017-09-20T14:24:25.823 回答
19

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

处理自动加载

正如Keith 提到的,如果模块自动加载,它可能会被锁定。如果它通过配置文件发生,添加-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,和/或限制 PowerShell 的使用Set-ExecutionPolicy,也可以使用-Scope参数运行。
于 2020-02-11T21:51:57.840 回答
8

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

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

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

  1. 关闭/强制通过任务管理器关闭所有 PowerShell/pwsh 实例。
  2. 在没有配置文件的情况下启动一个新的 pwsh 实例。赢+R >pwsh -NoProfile
  3. Uninstall-Module -Name PSfzf -Force
于 2021-12-17T11:05:08.840 回答