Azure CLI中处理包含哈希符号(#)的资源ID问题
这确实是Azure CLI在处理包含URL特殊字符的资源ID时出现的问题,并非这些证书是废弃资源。让我拆解下原因和解决办法:
问题根源
哈希符号#在URL中是锚点标识符,当Azure CLI把带#的资源ID传递给Azure REST API时,#后面的部分会被HTTP客户端当作锚点截断,没有实际发送到API服务器。这就导致API收到的资源路径不完整,无法识别对应的资源类型,进而抛出MissingApiVersionParameter错误(这个错误提示有点误导人,本质是资源路径无效)。
解决办法
你可以通过以下几种方式正确处理这类资源:
1. 手动URL编码资源ID中的#
把资源ID里的每个#替换成URL编码值%23,再执行az resource show命令。比如你之前的示例命令修改后:
$p = '/subscriptions/deadbeef-2021-4b7b-988c-abcdabcdabcd/resourceGroups/testrg/providers/Microsoft.Web/certificates' az resource show --subscription $subs --ids "$p/018B8D7BEAEB68E5A074B61434030D42CD46E3E2%23%23West Europe%23"
2. 批量处理时自动编码资源ID
如果要批量查询所有证书,你可以在脚本中对az resource list返回的ID进行URL编码后再传递。这里提供两种常用环境的实现:
PowerShell
$subs = "your-subscription-id" $rg = "testrg" az resource list --subscription $subs --resource-group $rg --resource-type Microsoft.Web/certificates --query '[].id' --output tsv | ForEach-Object { $encodedId = [Uri]::EscapeDataString($_) az resource show --subscription $subs --ids $encodedId }
Bash
subs="your-subscription-id" rg="testrg" az resource list --subscription $subs --resource-group $rg --resource-type Microsoft.Web/certificates --query '[].id' --output tsv | while read -r id; do encoded_id=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$id'))") az resource show --subscription $subs --ids "$encoded_id" done
3. 绕过--ids参数,用资源名称查询
另一种更简单的方式是直接用资源名称、资源组和类型来查询,完全避开带特殊字符的ID:
subs="your-subscription-id" rg="testrg" az resource list --subscription $subs --resource-group $rg --resource-type Microsoft.Web/certificates --query '[].name' --output tsv | while read -r name; do az resource show --subscription $subs --resource-group $rg --resource-type Microsoft.Web/certificates --name "$name" done
关于这些证书资源
带#的证书并非废弃资源,它们大概率是早期Azure App Service自动生成的证书(比如旧版的托管证书、或者与Web空间绑定的证书),只是命名规则包含了特殊字符。只要能正常查询到详情,就说明资源是有效的,可以正常使用。
内容的提问来源于stack exchange,提问作者Palec
相关产品推荐
相关产品推荐

