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
相关产品推荐
相关产品推荐

