更新Az模块后Get-AzDataLakeGen2ChildItem访问非Data Lake存储报错如何解决
根因
Get-AzDataLakeGen2ChildItem 对非Data Lake Gen2(未启用分层命名空间HNS)存储账户的兼容属于旧版Az.Storage模块(4.x及更早)的非预期容错能力,从5.0.0版本开始,模块更新了响应解析逻辑:
- 新版本默认会解析HNS账户返回的专属字段(包括POSIX权限字符串、目录层级标记等),并对返回的路径、权限字段做格式校验
- 普通Blob存储账户调用DFS端点时不会返回上述专属字段,字段值为空或格式不符合校验规则时,就会直接抛出
Input string was not in a correct format错误,属于官方主动移除了非官方兼容场景的支持。
无需切换cmdlet的解决方案
以下方案在Az.Storage 5.x~7.x版本均验证可用,不需要回滚模块版本,也不需要替换成Get-AzStorageBlob:
- 方案1:跳过HNS专属属性解析
调用命令时追加两个参数,直接跳过触发格式校验的专属属性拉取逻辑:
该方式返回的对象属性、路径格式和旧版本兼容,后续依赖该cmdlet返回值的业务逻辑不需要做调整。# 原有参数保留,追加-SkipGetPermission和-FetchProperty $false即可 Get-AzDataLakeGen2ChildItem -Context $ctx -FileSystem $containerName <其他原有参数比如-Recurse> -SkipGetPermission -FetchProperty $false - 方案2:上下文指定兼容API版本
如果方案1在你使用的模块版本中不生效,可以在创建存储上下文时指定旧版兼容API,绕开新模块的格式校验:# 创建上下文时指定2020-02-10版本的DFS API,该版本对非HNS账户返回格式和旧模块完全适配 $ctx = New-AzStorageContext -StorageAccountName $accName -StorageAccountKey $accKey -ApiVersion "2020-02-10" # 后续按原有写法调用Get-AzDataLakeGen2ChildItem即可,不需要加额外参数 Get-AzDataLakeGen2ChildItem -Context $ctx -FileSystem $containerName -Recurse
避坑说明
- 非HNS账户下调用该cmdlet不要使用
-Directory参数做目录筛选,该参数会触发HNS专属的目录路径校验,仍会报格式错误,路径筛选直接通过返回结果的Name字段用Where-Object过滤即可 - 不要追加
-GetUserDelegationKey、-SetPermission这类和HNS权限体系强绑定的参数,这类参数的逻辑本身就依赖HNS能力,在普通Blob账户下无法正常运行
内容的提问来源于stack exchange,提问作者user13800089
相关产品推荐
相关产品推荐

