如何将数组元素传递给带Filter参数的PowerShell命令
操作可行性说明
该需求完全可以实现,报错来自两处语法使用错误:
- 你使用了Bash风格的变量赋值语法,PowerShell中所有变量必须以
$开头,且直接用类Bash的$()捕获命令输出时,不会自动按行分割为独立数组元素,可能导致遍历逻辑失效。 Get-AzureADApplication的-Filter参数遵循OData筛选规则,字符串类型的匹配值必须用单引号包裹,你直接插入变量的写法会生成无边界的筛选语句,触发位置语法错误。
修正后的可执行代码
# 强制将az cli输出按行分割为PowerShell数组,变量名前补全$符号 $accounts = @(az ad sp list --show-mine --query [].appDisplayName -o tsv) foreach ($myApp in $accounts) { # 给筛选的字符串值包裹单引号,符合OData语法要求 Get-AzureADApplication -Filter "DisplayName eq '$myApp'" }
特殊场景兼容
如果你的服务主体显示名称本身包含单引号字符,需要提前对变量做转义处理,将名称内的单引号替换为两个连续单引号即可,避免筛选语句语法断裂:
$accounts = @(az ad sp list --show-mine --query [].appDisplayName -o tsv) foreach ($myApp in $accounts) { $escapedAppName = $myApp -replace "'", "''" Get-AzureADApplication -Filter "DisplayName eq '$escapedAppName'" }
校验方法
执行代码前可以先验证数组赋值是否正确:
- 运行
$accounts.Count,如果返回值和你名下拥有的服务主体数量一致,说明数组生成正常 - 如果返回值为1,说明输出没有被正确分割,上述代码中套在
@()内的强制数组写法已经可以解决这个问题
内容的提问来源于stack exchange,提问作者Jona187
相关产品推荐
相关产品推荐

