PowerShell从Azure DevOps API返回JSON中筛选指定文件路径
Azure DevOps提交变更筛选:非文件夹路径且排除含
/main的路径 问题分析
你之前的代码存在两个核心问题:
- 错误地将
Invoke-RestMethod返回的PowerShell对象转换为JSON字符串,导致无法直接访问对象属性。 - 使用
-notcontains判断文件夹的逻辑错误,该运算符用于集合元素检查,不适合直接判断对象属性。
解决方案
1. 修正非文件夹筛选逻辑
直接使用Invoke-RestMethod返回的对象,通过检查isFolder属性是否不存在或为false来筛选文件:
$GetChanges = "https://dev.azure.com/xxx/xxx/_apis/git/repositories/xxx/commits/xxx/changes?api-version=7.1-preview.1" # 直接获取API返回的PowerShell对象,无需转JSON $GetChangesInfo = Invoke-RestMethod -Uri $GetChanges -Method Get -UseDefaultCredential -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} # 筛选非文件夹条目:文件的item对象无isFolder属性,或isFolder为false $fileItems = $GetChangesInfo.changes | Where-Object { (-not $_.item.PSObject.Properties['isFolder']) -or ($_.item.isFolder -eq $false) } # 提取所有文件路径 $allFilePaths = $fileItems | ForEach-Object { $_.item.path }
2. 排除包含/main的路径
在已筛选的文件路径基础上,使用-notmatch正则匹配排除目标路径:
# 过滤掉包含/main的路径 $filteredPaths = $allFilePaths | Where-Object { $_ -notmatch '/main' } # 输出结果 $filteredPaths | ForEach-Object { Write-Host $_ }
完整整合代码
$GetChanges = "https://dev.azure.com/xxx/xxx/_apis/git/repositories/xxx/commits/xxx/changes?api-version=7.1-preview.1" $GetChangesInfo = Invoke-RestMethod -Uri $GetChanges -Method Get -UseDefaultCredential -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} # 一站式完成筛选:非文件夹 + 排除含/main的路径 $finalPaths = $GetChangesInfo.changes | Where-Object { (-not $_.item.PSObject.Properties['isFolder']) -or ($_.item.isFolder -eq $false) } | ForEach-Object { $_.item.path } | Where-Object { $_ -notmatch '/main' } # 打印最终结果 Write-Host "符合要求的路径:" $finalPaths | ForEach-Object { Write-Host $_ }
结果示例
针对你提供的更新后路径列表,运行代码会输出:
/trigger/TRIGGER_Test.json /notebooks/HKAZEDDB0002/BASIS/NoteBook_Test.py /pipeline/PL_Test2.json /pipeline/PL_Test.json
内容的提问来源于stack exchange,提问作者Joy
相关产品推荐
相关产品推荐

