You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell字符串变量含空格传递给Azure AD命令失败问题排查

问题:Azure AD批量添加AppRole时CLI参数报错

我尝试在Azure AD中为应用添加多个AppRole,先通过以下脚本获取目标角色:

$apiAppRoles = az ad app list --app-id $apiId --query '[0].appRoles' `
    | ConvertFrom-Json `
    | Where-Object {$_.value -in "role1", "role2"} `

随后想将这些角色作为$permissions变量传递给az ad app permission add命令:

az ad app permission add `
    --id $appId `
    --api $apiId `
    --api-permissions $permissions

根据参数定义,--api-permissions需要空格分隔的{id}={type}列表,所以我构建了字符串变量:

$test = "$($apiAppRoles[0].id)=Role $($apiAppRoles[1].id)=Role"

但传入命令后报错:

Usage error: Please provide both permission id and type, such as `--api-permissions e1fe6dd8-ba31-4d61-89e7-88639da4683d=Scope`

奇怪的是,直接把权限值以字面量写进命令(比如用虚拟GUID)就能正常运行:

az ad app permission add `
    --id $appId `
    --api $apiId `
    --api-permissions 00000000-0000-0000-0000-000000000001=Role 00000000-0000-0000-0000-000000000002=Role

而且只传递单个AppRole时也能正常执行,请问问题出在哪?


原因与解决办法

核心原因

PowerShell传递字符串变量给外部命令(比如az cli)时,会把整个字符串当作单个参数处理。而az cli的--api-permissions需要的是多个独立的参数项(每个id=Role是一个参数),所以字符串里的空格不会被az cli解析成分隔符,反而会被当成单个参数的一部分,导致识别失败。

而直接写字面量时,PowerShell会自动把空格分隔的内容拆成多个独立参数,az cli就能正确识别。单个角色时字符串本身就是一个参数项,所以不会报错。

解决方法(推荐):用数组传递参数项

把每个权限项转换成数组的元素,PowerShell会自动将数组元素作为独立参数传递给az cli:

# 遍历获取到的AppRole,生成单个权限项数组
$permissions = $apiAppRoles | ForEach-Object { "$($_.id)=Role" }

# 直接传递数组即可
az ad app permission add `
    --id $appId `
    --api $apiId `
    --api-permissions $permissions

备选方法:使用--%停止PowerShell参数解析(不推荐)

如果一定要用字符串变量,可以用--%让PowerShell直接把后续内容原封不动传递给az cli,但这种方式无法解析PowerShell变量(比如$appId),灵活性差:

$permissions = "$($apiAppRoles[0].id)=Role $($apiAppRoles[1].id)=Role"
az ad app permission add --% `
    --id YOUR_APP_ID `
    --api YOUR_API_ID `
    --api-permissions $permissions

内容的提问来源于stack exchange,提问作者Lodewijk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:41:35