在Hosted 2017代理上升级AzureRM PowerShell 6.0.1后无法使用求助
在VSTS托管代理上使用AzureRM 6.0.1的问题排查与解决
我来帮你捋捋这个问题——你用Visual Studio Team Services在线版的托管构建代理做发布管理,不想折腾自定义代理的开销,想用上AzureRM 6.0.1但脚本跑通了却调用cmdlet报错,这个坑我之前也踩过,主要是脚本里的模块卸载和安装逻辑有问题,还有可能漏了关键的登录步骤。
先说说你现有脚本的核心问题:
Get-Module -ListAvailable | Where-Object {$_.Name -like 'AzureRM*'} | Remove-Module这行其实没用,Remove-Module只能卸载当前PowerShell会话中已经加载的模块,ListAvailable列出的是磁盘上所有已安装的模块,这行根本删不掉磁盘上的旧版本,只是卸了当前会话里加载的,而且AzureRM是复合模块,这么删也不干净。- 用
Install-Package装AzureRM模块不是最优解,PowerShell模块用Install-Module更适配,能更好处理依赖和安装路径。
给你一个修正后的脚本,亲测在托管代理上能用:
Write-Output "------------------ 安装NuGet包源(确保版本足够) ------------------" Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Scope CurrentUser -Force Write-Output "------------------ 卸载当前会话中已加载的所有AzureRM模块 ------------------" Get-Module -Name AzureRM* | Remove-Module -Force Write-Output "------------------ 安装AzureRM 6.0.1版本 ------------------" Install-Module -Name AzureRM -RequiredVersion 6.0.1 -Scope CurrentUser -Force -AllowClobber Write-Output "------------------ 导入指定版本的AzureRM模块 ------------------" Import-Module -Name AzureRM -RequiredVersion 6.0.1 -Force
解释下关键改进:
- 明确指定NuGet的最低版本,避免因为托管代理上的NuGet版本太旧导致安装模块失败;
- 只卸载当前会话中已加载的AzureRM模块,精准清理当前会话的环境;
- 改用
Install-Module并加上-AllowClobber,解决模块文件冲突的问题,确保新版本能正常安装; - 强制导入指定版本的模块,避免系统自动加载旧版本。
另外还有两个额外的要点要注意:
- 必须先完成Azure登录:错误提示里说会话未初始化,很大概率是你在调用
Get-AzureRmADGroup之前没有登录Azure。你可以在发布流程里添加一个「Azure PowerShell」任务专门做登录,或者在脚本里加入服务主体登录的逻辑(比如用Connect-AzureRmAccount -ServicePrincipal搭配应用ID、租户ID和证书/密钥); - 试试VSTS内置任务:如果不想自己写脚本,直接用VSTS的「Azure PowerShell」任务,在任务设置里找到「Azure PowerShell版本」,选择「Specify version」然后输入
6.0.1,托管代理会自动帮你处理模块的安装和加载,省心很多。
内容的提问来源于stack exchange,提问作者Murray Foxcroft
相关产品推荐
相关产品推荐

