背景: 我通过MSI安装了Azure-PowerShell 1.x,然后通过命令提示符添加了一些Azure资源管理模块。 一切都很好;然后昨天下午,ISE莫名其妙地消失了。为了解决这个问题,我计划卸载MSI&然后重新安装。 (我不知道有必要先卸载手动添加的模块。) 卸载似乎运行正常,但它没有删除手动安装的模块,也没有警告我。
结果:计算机不再安装Azure-PowerShell。我无法安装,卸载或修复安装,因为某些模块仍然存在:
PowerShell Gallery中的Azure模块已安装在此上 机。请在安装此MSI之前删除这些模块。
有没有办法去修复"这个装置?手动删除文件/清理注册表,还是强制MSI安装在哪里?
这一切都在Azure上的VM上运行。我可以删除整个VM&如果有必要,从头开始,但如果有相对简单的修复,我宁愿避免这样做。
谢谢!
答案 0 :(得分:18)
好的,所以我尝试了上面的项目来移除windows powershell,发现实际上并没有完全删除powershell。
这至少在Windows 7上看似不合适。
如果您运行uninstall-module Azure
或Uninstall-Module AzureRM
,它会卸载某些内容,看起来就像我认为的基本模块。
然后,如果你这样做:
Get-Module AzureRM -ListAvailable
不,不是真的。
如果你这样做:
Get-Module -ListAvailable AzureRM*
你会发现任何数量的子模块仍然存在。 (出于某种原因,通配符与Get-Module一起使用,但不与Uninstall-Module一起使用)
好的,那么只需要卸载 - 模块AzureRm *吧? 不,不是真的
取决于您的powershell版本(或者可能不是,我不确定) Install-Module抱怨您无法在Uninstall-Module命令中使用通配符。 (上帝知道为什么通配符的重点是什么?如果不是这样的话,那么这就是windows,所以我不得不把它搞砸了。)
如果您查看%System-root%\ Program Files \ windowspowershell \ modules,您仍会看到那里的模块。
这是为什么?我不确定,但这是我必须要做的,以清理所有旧版本和更新版本的Azure powershell,我必须回到一个干净的名单。 因此,为了解决缺少通配符支持的问题,我只使用了foreach循环:
foreach ($module in (Get-Module -ListAvailable AzureRM*).Name |Get-Unique) {
write-host "Removing Module $module"
Uninstall-module $module
}
警告不要尝试将此作为Visual Studio代码或visual studio运行,因为根据您的锁定,您可能会收到错误,因为它往往会预加载模块并锁定打开的东西。将它放在名为Removeold-AzureRM.ps1的文件中,并从PowerShell控制台窗口运行,如下所示: 。\ Remove-AzureRM.ps1
另外,请确保在尝试之前关闭Visual Studio代码和Visual Studio,否则您可能仍会收到类似的错误消息。
如果您在卸载AzureRM后运行此操作,您会发现事情停止工作,您只有最后的手段。 删除%System-root%\ Program Files \ windowspowershell \ modules
中的所有AzureRM模块编辑我已经重新测试了这个,如果您安装了azurerm 5.0.1并且您已经删除了azurerm,那么上面的代码似乎仍然有用,所以我对其他版本也是错误的 强>
现在您将确保已对此进行排序,现在可以使用Install-Module AzureRM重新安装Azure PowerShell。
如果你意外地犯了像我这样的冒险故事的错误,不要试图用WMF 5.1或5.0重新安装它,因为它会安装得很好但你仍然没有powershellget,为什么我不确定和再次这是Windows,所以让我们把它搞砸。
好的,那么如何解决呢?
您唯一的办法是下载powershellget
的版本然后将PowerShellGet-1.5.0.0 \ PowerShellGet复制到您的modules文件夹。 然后Install-Module将再次运行。
是的,我知道我们都说不是重新安装更安全吗?
是的,但是对于那些喜欢我的人来说,由于某种原因这不是一个选择,以上是你最好的选择。我希望这对某人有所帮助,因为这让我至少花了3天的时间来理清为什么当我确定已经删除了所有内容时,我一直在执行较旧的模块。
答案 1 :(得分:13)
为了更快,您可以并行卸载:
workflow Uninstall-AzureModules
{
$Modules = (Get-Module -ListAvailable Azure*).Name |Get-Unique
Foreach -parallel ($Module in $Modules)
{
Write-Output ("Uninstalling: $Module")
Uninstall-Module $Module -Force
}
}
Uninstall-AzureModules
Uninstall-AzureModules #second invocation to truly remove everything
答案 2 :(得分:2)
它只是一个Dev VM。我开始训练并重新开始。获得的经验:在卸载MSI之前卸载PowerShell库组件。
答案 3 :(得分:0)
尝试通过MSI(第一个)然后cmdline:
卸载模块# Uninstall the AzureRM component modules
Uninstall-AzureRM
# Uninstall AzureRM module
Uninstall-Module AzureRM
# Uninstall the Azure module
Uninstall-Module Azure
# Or, you can nuke all Azure* modules
# Uninstall-Module Azure* -Force
之后重新启动计算机,然后通过WebPI / MSI重新安装。 https://azure.microsoft.com/en-us/blog/azps-1-0/
答案 4 :(得分:0)
我发现命令Get-InstalledModule对发现已安装的模块更有效。
我的最新脚本如下:
# If installed, remove the old AzureRm module
$allModules = Get-InstalledModule
foreach ($module in $allModules)
{
if ($module.Name -match "AzureRM.*")
{
Write-Host "Removing $($module.Name)..."
Uninstall-Module -Name $module.Name -Force -AllVersions
}
}
# If not installed, install the new Az module
$azModule = Get-InstalledModule -Name Az
if (!$azModule)
{
Install-Module -Name Az -Scope CurrentUser -AllowClobber -Force
}
# Enable AzureRm aliases for script compat
Enable-AzureRmAlias -Scope LocalMachine
答案 5 :(得分:0)
我在@BlueSky答案上创建了此变体,以保留一个特定的版本及其依赖性:
workflow Uninstall-AzureModules
{
$skip = Find-Module AzureRM -RequiredVersion 2.1.0
$dependencies = $skip.Dependencies | %{ Get-Module -FullyQualifiedName @{ ModuleName=$_["Name"]; RequiredVersion=$_["RequiredVersion"] } -ListAvailable }
$modules = Get-Module azurerm* -ListAvailable |
where { $_.Version -ne '2.1.0' } |
where { -Not(Compare-Object $dependencies $_ -IncludeEqual -ExcludeDifferent) }
foreach -parallel ($module in $modules)
{
Write-Output ("Uninstalling: $($module.Name) $($module.Version)")
Uninstall-Module -Name $module.Name -RequiredVersion $module.Version -Force -ea SilentlyContinue
}
}
答案 6 :(得分:0)
在我的情况下,这不起作用。我正在使用Powershell v7.02 MACOS v10.15.6。起作用的是这段代码:
Function Uninstall-AzureModules
{
$Modules = (Get-Module -ListAvailable Azure*).Name |Get-Unique
Foreach ($Module in $Modules)
{
Write-Output ("Uninstalling: $Module")
Uninstall-Module $Module -Force
}
}
Uninstall-AzureModules
Uninstall-AzureModules
我验证了AzureRM模块已不再使用:
Get-InstalledModule -Name AzureRM*