You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取GCP组织内启用Container Registry API的项目列表?脚本报错求助

解决GCP项目Container Registry API检索脚本报错及优化方案

报错原因分析

报错提示无效项目ID,核心问题是原脚本用for project in $all_projects遍历项目时,会把输出中的所有空白字符(换行、空格等)作为分隔符拆分内容,若gcloud projects list的输出存在异常格式(比如混入非项目ID字符),就会导致无效值传入后续命令。另外,部分项目可能存在权限限制,也会触发类似报错。

修复后的脚本

#!/bin/bash

OUTPUT_CSV="project-container111.csv"
# 初始化CSV表头,加入ProjectId方便后续核对
echo "ProjectName,ProjectNum,ProjectId" > "$OUTPUT_CSV"

# 用while read循环安全遍历项目ID,避免分词错误
gcloud projects list --format="value(projectId)" | while read -r project_id; do
    # 跳过空行
    [[ -z "$project_id" ]] && continue

    # 直接筛选已启用的Container Registry API,同时捕获权限/项目无效错误
    if gcloud services list --project="$project_id" \
        --filter='config.name:containerregistry.googleapis.com AND state:ENABLED' \
        --format='value(config.name)' &>/dev/null; then
        # 单次调用获取项目名称和编号,减少API请求次数
        project_details=$(gcloud projects describe "$project_id" --format="value(name, projectNumber)")
        project_name=$(echo "$project_details" | awk '{print $1}')
        project_num=$(echo "$project_details" | awk '{print $2}')
        # 处理项目名称中的逗号,避免CSV格式错位
        project_name=${project_name//,/\\,}
        echo "$project_name,$project_num,$project_id" >> "$OUTPUT_CSV"
    else
        # 输出跳过提示到标准错误流,不干扰CSV内容
        echo "跳过项目 $project_id:未启用API、无访问权限或项目无效" >&2
    fi
done

关键优化说明

  • 安全遍历:用while read -r替代for循环,严格按行读取项目ID,避免格式拆分错误
  • 精准过滤:在gcloud services list中加入state:ENABLED条件,直接筛选已启用的API,无需后续空值判断
  • 减少API调用:单次调用gcloud projects describe同时获取名称和编号,降低API请求频次
  • CSV兼容性:处理项目名称中的逗号,避免CSV列错位问题
  • 错误处理:将错误输出重定向,同时跳过无权限或无效的项目,保证脚本持续运行

前置要求

确保当前gcloud账号拥有组织内所有项目的serviceusage.services.list和resourcemanager.projects.get权限,否则部分项目会被跳过。

内容的提问来源于stack exchange,提问作者user10160459

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 14:35:24