【问题标题】:Length of a variable in powershell scriptpowershell脚本中变量的长度
【发布时间】:2019-08-27 10:52:31
【问题描述】:

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

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

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

【问题讨论】:

  • 尝试Array subexpression operator @( )$RepositoryTags = @(az acr repository show-tags --name $AzureRegistryName --repository $RepositoryName --orderby time_desc --output tsv)

标签: powershell azure-container-registry


【解决方案1】:

我尝试打印变量类型:

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

【讨论】:

  • 你为什么不使用Azure powershell 模块?在 cli 中使用 az 时,您只是从外部程序中获取字符串。
猜你喜欢
  • 2014-08-01
  • 2023-02-07
  • 2016-11-16
  • 2019-02-26
  • 1970-01-01
  • 2022-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多