如何解决GitHub Actions中PowerShell输出JSON大括号被屏蔽的问题
解决GitHub Actions中PowerShell输出JSON大括号被屏蔽的问题
问题原因
GitHub Actions的日志与输出机制会将单个{}识别为模板占位符或敏感内容标记,从而自动替换为***,这种情况在使用旧版::set-output命令时尤为明显。
解决方案1:使用GitHub官方推荐的新输出方式(优先选择)
::set-output已被GitHub弃用,改用写入$GITHUB_OUTPUT指定的文件来传递输出,无需额外转义即可完整保留JSON格式。
修改输出代码为:
$jsonOutput = $array1 | ConvertTo-Json -Compress Add-Content -Path $env:GITHUB_OUTPUT -Value "value=$jsonOutput"
后续Job复用该输出作为矩阵的示例:
jobs: generate-matrix-job: runs-on: ubuntu-latest outputs: matrix-data: ${{ steps.gen-matrix.outputs.value }} steps: - name: Generate JSON matrix id: gen-matrix shell: pwsh run: | # 替换为你的数组生成逻辑 $vars = @("item1", "item2") $array1 = foreach ($var in $vars) { $output = "hello$($var -replace 'item','')" @{ variable1 = $output } } $jsonOutput = $array1 | ConvertTo-Json -Compress Add-Content -Path $env:GITHUB_OUTPUT -Value "value=$jsonOutput" use-matrix-job: needs: generate-matrix-job runs-on: ubuntu-latest strategy: matrix: ${{ fromJson(needs.generate-matrix-job.outputs.matrix-data) }} steps: - name: Print matrix value run: echo "当前变量值:${{ matrix.variable1 }}"
解决方案2:对JSON进行转义(兼容旧版::set-output)
如果必须使用旧版输出命令,需将JSON中的{替换为{{、}替换为}},避免被GitHub解析为模板语法:
$jsonOutput = $array1 | ConvertTo-Json -Compress $escapedJson = $jsonOutput -replace '\{', '{{' -replace '\}', '}}' Write-Host "::set-output name=value::$escapedJson"
额外优化:数组创建方式
当前使用$array1 += @(@{"variable1" = $output})的效率较低,推荐直接通过foreach循环生成数组:
$array1 = foreach ($var in $vars) { $output = dostuff($var) @{ variable1 = $output } }
该方式会自动将循环结果收集为数组,在处理大量数据时性能更优。
内容的提问来源于stack exchange,提问作者Onno van der Horst
相关产品推荐
相关产品推荐

