Azure Python SDK存储备份脚本处理$web容器时报无效字符错误
问题根因
Azure Blob存储仅允许系统内置的特殊容器(如静态网站专用的$web、日志容器$logs等)使用$作为名称前缀,用户自定义创建容器时,命名规则要求必须以小写字母或数字开头,不可包含$等特殊字符。
你代码中直接将源容器名与today变量拼接作为目标容器名,当源容器为$web时,生成的$web+日期格式的名称不符合自定义容器命名规范,因此抛出The Resource contains an invalid character错误。
解决方案
你可以根据需求选择以下任意一种处理方式:
方式1:转换特殊容器名(保留原始内容)
对带$前缀的系统容器名做预处理后再拼接日期,生成合法的目标容器名,修改对应代码行即可:
# 原代码:target_destination_blob = container['name'] + today # 修改为:先移除名称开头的$符号 processed_container_name = container['name'].lstrip('$') target_destination_blob = processed_container_name + today
如果需要保留$web的标识,也可以将$替换为合法的下划线字符:
processed_container_name = container['name'].replace('$', '_') target_destination_blob = processed_container_name + today
方式2:过滤系统容器(不需要复制特殊容器时使用)
如果不需要复制$web这类系统内置容器,可以直接在遍历容器时跳过所有$开头的容器:
for container in all_containers: # 新增过滤逻辑,跳过系统容器 if container['name'].startswith('$'): continue # 后续原有逻辑保持不变
额外优化建议
- 你代码中重复初始化了两次
BlobServiceClient,可以删除冗余的初始化代码,减少不必要的资源消耗 - 你注释了异常捕获逻辑,建议恢复并完善异常处理,避免单个Blob/表复制失败导致整个脚本终止
- 复制操作是异步的,建议增加复制状态校验逻辑,避免复制失败未被感知
内容的提问来源于stack exchange,提问作者Nayden Van
相关产品推荐
相关产品推荐

