Azure DevOps YAML Pipeline输出变量丢失JSON开头括号问题
解决Azure DevOps Pipeline中JSON数组丢失开头
[的问题 问题根源
Azure DevOps的##vso[task.setvariable]命令在处理多行格式化JSON时,容易因日志换行或命令解析逻辑,导致数组开头的[被截断。PowerShell默认生成的带缩进换行的JSON,会放大这类解析异常的概率。
解决方案
1. 强制生成数组并压缩为单行JSON
修改脚本中生成JSON和设置变量的代码,用-AsArray确保输出是数组格式,同时通过-Compress将JSON压缩为单行,避免换行引发的解析问题:
# 强制转为数组格式,单元素场景也能生成[]包裹的JSON $roleAssignmentsJson = ConvertTo-Json -InputObject $roleAssignments -AsArray -Compress # 输出变量命令 Write-Host "##vso[task.setvariable variable=RoleAssignmentsObject]$roleAssignmentsJson"
2. 验证变量传递正确性
在后续任务中添加调试步骤,确认变量内容是否完整:
- task: PowerShell@2 displayName: Debug RoleAssignmentsObject inputs: targetType: 'inline' script: | Write-Host "RoleAssignmentsObject content: $(RoleAssignmentsObject)" try { $assignments = ConvertFrom-Json -InputObject "$(RoleAssignmentsObject)" Write-Host "JSON转换成功" } catch { Write-Error "转换失败: $_" }
3. 确保$roleAssignments为数组类型
在脚本中提前校验并强制转换类型,避免单元素场景下ConvertTo-Json不生成数组结构:
# 非数组类型强制转为数组 if (-not $roleAssignments -is [array]) { $roleAssignments = @($roleAssignments) }
额外处理方案
如果单行压缩仍有问题,可尝试用单引号包裹JSON字符串后传递:
Write-Host "##vso[task.setvariable variable=RoleAssignmentsObject]'$roleAssignmentsJson'"
后续转换时去除首尾单引号即可:
$assignments = ConvertFrom-Json -InputObject "$(RoleAssignmentsObject)".Trim("'")
内容的提问来源于stack exchange,提问作者Yousef Imran
相关产品推荐
相关产品推荐

