背景:我通过MSI安装了Azure-PowerShell 1.x,随后通过命令提示符添加了一些Azure资源管理模块.一切都很好; 然后昨天下午,ISE莫名其妙地消失了.为了解决这个问题,我计划卸载MSI然后重新安装.(我不知道有必要先卸载手动添加的模块.)卸载似乎运行正常,但它没有删除手动安装的模块,也没有警告我他们.
结果:计算机不再安装Azure-PowerShell.我无法安装,卸载或修复安装,因为某些模块仍然存在:
PowerShell库中的Azure模块安装在此计算机上.请在安装此MSI之前删除这些模块.
有没有办法"修复"这个装置?手动删除文件/清理注册表,或强制MSI安装在那里的任何东西?
这一切都在Azure上的VM上运行.我可以删除整个VM并在必要时从头开始,但如果有一个相对简单的修复,我宁愿避免这样做.
谢谢!
好的,所以我尝试了上面的项目删除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 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天的时间来理清为什么我一直在执行旧的模块,当我确定我已经删除了所有内容.
为了更快,您可以并行卸载:
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