Azure DevOps的Powershell任务中Where-Object多条件过滤失效如何解决
错误原因与修复方案
核心问题出在Where-Object的条件写法错误,共2处:
- 你将属性名用双引号包裹后直接参与比较,本质是对两个固定字符串做相等判断,完全没有读取管道中构建对象的属性值:
原写法中的"status" -eq "inProgress"实际是判断字符串"status"是否等于字符串"inProgress",结果永远为$false,你之前单条件能生效大概率是用了无脚本块的简化写法Where-Object status -eq "inProgress",和当前脚本块写法逻辑完全不同。 - 嵌套属性
templateParameters.param1需要通过管道变量$_访问,不能直接写字符串做比较。
正确的Where-Object写法
将原来的过滤行替换为以下内容即可:
[array]$runningBuilds = $GET_BUILDS_BY_DEFINITION_RESPONSE.value | Where-Object {$_.status -eq "inProgress" -and $_.templateParameters.param1 -eq "myparam"}
额外注意事项
- 你原代码中生成认证信息时用到的
$user变量没有定义,Azure DevOps PAT认证的用户名可留空,建议将对应行修改为:$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes((":$token"))) - 若过滤后仍无结果,可先执行
$GET_BUILDS_BY_DEFINITION_RESPONSE.value | ConvertTo-Json -Depth 10输出完整的构建对象结构,确认templateParameters下是否存在param1属性,避免拼写大小写不匹配问题。
内容的提问来源于stack exchange,提问作者Sibtain
相关产品推荐
相关产品推荐

