如何清理不良的Azure PowerShell卸载?

问题描述 投票:7回答:6

背景:我通过MSI安装了Azure-PowerShell 1.x,随后通过命令提示符添加了一些Azure资源管理模块。一切都很好;然后昨天下午,ISE莫名其妙地消失了。为了解决这个问题,我计划卸载MSI然后重新安装。 (我不知道有必要先卸载手动添加的模块。)卸载似乎运行正常,但它没有删除手动安装的模块,也没有警告我他们。

结果:计算机不再安装Azure-PowerShell。我无法安装,卸载或修复安装,因为某些模块仍然存在:

PowerShell库中的Azure模块安装在此计算机上。请在安装此MSI之前删除这些模块。

有没有办法“修复”这个装置?手动删除文件/清理注册表,或强制MSI安装在那里的任何东西?

这一切都在Azure上的VM上运行。我可以删除整个VM并在必要时从头开始,但如果有一个相对简单的修复,我宁愿避免这样做。

谢谢!

azure-powershell
6个回答
20
投票

好的,所以我尝试了上面的项目删除Windows PowerShell,发现它实际上并没有完全删除powershell。

这至少在Windows 7上似乎没有正确。

如果你运行uninstall-module AzureUninstall-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 Code和Visual Studio,否则您可能仍会收到类似的错误消息。

如果您在卸载AzureRM后运行此命令,您会发现事情停止工作,您只有最后的手段。删除%System-root%\ Program Files \ windowspowershell \ modules中的所有AzureRM模块

编辑我已经重新测试了这个,如果您安装了azurerm 5.0.1并且您已经删除了azurerm,那么上面的代码似乎仍然有效,所以我对其他版本也是错误的

现在,您将在此时确定已对此进行排序,现在可以使用Install-Module AzureRM重新安装Azure powershell。

如果你意外地犯了像我这样的冒险powershell的错误,不要试图用WMF 5.1或5.0重新安装它,因为它会安装得很好但是你仍然没有powershellget,为什么我不确定这又是windows所以让我们把它搞砸。

那么如何解决呢?

您唯一的办法是下载powershellget的版本

并将PowerShellGet-1.5.0.0 \ PowerShellGet复制到您的modules文件夹。然后Install-Module将再次运行。

是的我知道我们都说不是重新安装更安全吗?

是的,但是对于那些喜欢我的人来说,由于某种原因这不是一个选择,以上是你最好的选择。我希望这可以帮助别人,因为这花了我至少3天的时间来理清为什么我一直在执行旧的模块,当我确定我已经删除了所有内容。


15
投票

为了更快,您可以并行卸载:

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
投票

它只是一个Dev VM。我开始训练并重新开始。获得的经验:在卸载MSI之前卸载PowerShell库组件。


0
投票

尝试通过MSI(第一个)然后命令行卸载模块:

# 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/


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

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.