Powershell脚本中变量的长度

时间:2019-08-27 10:52:31

标签: powershell azure-container-registry

我正在编写一个脚本来列出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返回正确的长度,即大多数时候标签的总数。

但是,当存储库中只有一个标签时,其长度不等于实际存在的标签数。

为什么会这样?该如何解决?

1 个答案:

答案 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,结果也将被视为数组而不是字符串。