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

时间:2015-12-10 14:27:30

标签: azure-powershell

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

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

  

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

有没有办法去修复"这个装置?手动删除文件/清理注册表,还是强制MSI安装在哪里?

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

谢谢!

7 个答案:

答案 0 :(得分:18)

好的,所以我尝试了上面的项目来移除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代码和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*