我正在编写一个脚本来列出ACR中存储库的标签。代码是这样的:
$RepoList = az acr repository list --name $AzureRegistryName --output tsv
Write-Host "Repos: " $RepoList.length
foreach ($RepositoryName in $RepoList) {
Write-Host "Get all tags in repository: " $RepositoryName
$RepositoryTags = az acr repository show-tags --name $AzureRegistryName --repository $RepositoryName --orderby time_desc --output tsv
Write-Host "Tags: " $RepositoryTags.length
}
$RepositoryTags.length
返回正确的长度,即大多数时候标签的总数。
但是,当存储库中只有一个标签时,其长度不等于实际存在的标签数。
为什么会这样?该如何解决?
答案 0 :(得分:2)
我尝试打印变量类型:
$RepoList.getType()
$RepositoryTags.getType()
我注意到,当一个存储库有多个标签可用时,类型为:
$RepositoryTags.getType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
只有一个标签时,类型为:
$RepositoryTags.getType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
这意味着,在第二种情况下,$RepositoryTags.length
返回(该标签的)字符串的长度。显然,这将不等于该存储库可用标签的数量。
要解决此问题,请使用数组子表达式运算符@( ... )
将结果获取到数组。将行更改为:
$RepoList = @(az acr repository list --name $AzureRegistryName --output tsv)
$RepositoryTags = @(az acr repository show-tags --name $AzureRegistryName --repository $RepositoryName --orderby time_desc --output tsv)
现在,即使标记数为1,结果也将被视为数组而不是字符串。