我们在一个部署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
有人有任何想法解决这个问题吗?
答案 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
更新模块?Import-Module
可能有效。尽管如此,它并不能使Remove-Module
的工作达到100%。Install-Module -Scope CurrentUser
仅为服务用户安装模块,和/或使用Set-ExecutionPolicy
限制PowerShell的使用,可以使用-Scope
参数运行也是。答案 2 :(得分:1)
对于我来说,我是这样解决的: