GitLab CI中PowerShell向release-cli传递JSON的正确方式
解决GitLab CI中PowerShell传递JSON给release-cli的引号问题
问题根源
你的错误是因为PowerShell解析Start-Process的参数字符串时,JSON中的双引号被错误拆分,导致release-cli无法正确识别--asset-link的完整参数值,误以为出现了未定义的-asset-link flag。
正确的解决方法
方法1:使用参数数组传递(推荐)
PowerShell的Start-Process的-ArgumentList支持直接传递参数数组,可避免引号转义混乱,每个参数都是独立元素:
release: stage: release tags: - windows rules: - if: $CI_COMMIT_TAG variables: ASSET_LINK_DETAILS: '{"name":"${PACKAGE_NAME}.zip","url":"${PACKAGE_REGISTRY_URL}/${PACKAGE_NAME}.zip"}' script: - 'Write-Host "Creating release..."' - | Start-Process -FilePath "release-cli" -ArgumentList @( "create", "--name", "Release $CI_COMMIT_TAG", "--tag-name", "$CI_COMMIT_TAG", "--asset-link", $env:ASSET_LINK_DETAILS ) -NoNewWindow -Wait - 'Write-Host "Finished creating release..."'
方法2:正确转义PowerShell中的字符串引号
如果必须用单个字符串传递参数,需在PowerShell中用反引号(`)转义JSON内部的双引号,同时确保整个参数字符串被正确包裹:
release: stage: release tags: - windows rules: - if: $CI_COMMIT_TAG variables: ASSET_LINK_DETAILS: "{\"name\":\"${PACKAGE_NAME}.zip\",\"url\":\"${PACKAGE_REGISTRY_URL}/${PACKAGE_NAME}.zip\"}" script: - 'Write-Host "Creating release..."' - 'Start-Process -FilePath "release-cli" -ArgumentList "create --name `"Release $CI_COMMIT_TAG`" --tag-name `"$CI_COMMIT_TAG`" --asset-link `"$env:ASSET_LINK_DETAILS`"" -NoNewWindow -Wait' - 'Write-Host "Finished creating release..."'
说明
- 方法1的参数数组方式更可靠,PowerShell会自动处理每个参数的引号包裹,无需手动转义嵌套引号。
- 方法2中,要在
$env:ASSET_LINK_DETAILS前后添加转义的双引号("),确保release-cli收到的--asset-link参数是完整的JSON字符串。
内容的提问来源于stack exchange,提问作者Mateusz Wójt
相关产品推荐
相关产品推荐

