如何在Azure DevOps发布流水线的Azure CLI内联脚本中使用变量
问题结论
Azure发布流水线的Azure CLI任务内联脚本完全支持自定义变量,报错的核心原因是脚本语法和运行环境不匹配。
原因分析
- 语法混用冲突:你本地运行脚本用的是Bash环境,
miid=$(az ...)是Bash专属的变量赋值语法,但是你后续命令加了call前缀,这是Windows批处理的专属语法,两种不同脚本环境的语法混写会直接导致解析失败 - 流水线任务配置不匹配:如果Azure CLI任务选择了Windows代理、脚本类型选择了批处理/PowerShell时,Bash的变量赋值语法无法被识别,系统会把整行变量赋值语句当做可执行命令运行,因此抛出「miid is not recognized as an internal command」报错。
解决方案
方案1:使用Linux代理 + Bash脚本(改动最小,和本地运行逻辑一致)
- 将Azure CLI任务的运行代理切换为Linux系统(微软托管Ubuntu代理或自助Linux代理),脚本类型选择「Shell」,删掉所有命令前的
call前缀,内联脚本直接写:
miid=$(az identity show -g Resourcegroup -n prodaks-agentpool --query "principalId" -o tsv) az keyvault set-policy -n proddigitalkeyvault1 --key-permissions get --object-id $miid az keyvault set-policy -n proddigitalkeyvault1 --secret-permissions get --object-id $miid az keyvault set-policy -n proddigitalkeyvault1 --certificate-permissions get --object-id $miid
方案2:使用Windows代理 + PowerShell脚本
如果必须使用Windows代理运行任务,将脚本类型选择为「PowerShell」,按照PowerShell语法修改变量赋值逻辑,无需加call前缀,脚本内容如下:
$miid = az identity show -g Resourcegroup -n prodaks-agentpool --query "principalId" -o tsv az keyvault set-policy -n proddigitalkeyvault1 --key-permissions get --object-id $miid az keyvault set-policy -n proddigitalkeyvault1 --secret-permissions get --object-id $miid az keyvault set-policy -n proddigitalkeyvault1 --certificate-permissions get --object-id $miid
额外注意事项
- 你原有脚本中
--secret-permission为单数拼写错误,正确参数为复数--secret-permissions,拼写错误会导致权限配置不生效 - 运行Azure CLI任务的服务主体本身需要具备Key Vault的访问策略编辑权限,否则
set-policy命令会抛出权限不足报错
内容的提问来源于stack exchange,提问作者Callum Hester
相关产品推荐
相关产品推荐

