如何从Azure命令“ Powershell中的az组列表”的一系列“结果”中仅选择一个属性?

我试图从Powershell中的Azure命令az group list返回的一系列“结果”(对象?)中选择一个属性吗?

我知道这听起来微不足道,但这是奇怪的地方,希望有一个简单的解释。

如果我运行Azure命令az group list -o table(在我成功使用az login登录之后),我将得到以下典型响应

PS src> az group list -o table             
Name              Location    Status
----------------  ----------  ---------
group0            westeurope  Succeeded
group1            westeurope  Succeeded
group2            uksouth     Succeeded
group3            westeurope  Succeeded
group4            westeurope  Succeeded
group5            westeurope  Succeeded
group6            westeurope  Succeeded
group7            uksouth     Succeeded
group8            westeurope  Succeeded
group9            westeurope  Succeeded

但是,如果我尝试通过

仅选择Name属性
  

az群组列表|选择-p名称

然后,我得到大约2个屏幕,其中包括空行,没有任何显示。所以问题是,上面的命令出了什么问题?以及我该如何解决?

我尝试了以下实验,以深入了解返回的对象的确切类型,并获得一些我不理解的结果。我希望这对具有更多Azure和Powershell经验的人有意义。

以下是假设您拥有蔚蓝帐户的非常容易重现问题的步骤。

  1. 启动Powershell,例如在Mac终端上,键入pwsh
  2. 登录到天青az login
  3. 键入az group list -o table

观察到列表又回来了,并且格式正确。

  1. 键入az group list | select -p name

观察几个充满空白行的屏幕。没有文字。

  1. 挠头,想知道发生了什么事吗? (笑)

地块厚度

az group list本身会返回一些充满此

的屏幕
[
 ... lots of these ...
 {
    "id": "/subscriptions/this-is-super-wierd-i-cant-select-name-prop/resourceGroups/spikes","location": "westeurope","managedBy": null,"name": "spikes","properties": {
      "provisioningState": "Succeeded"
    },"tags": {},"type": null
  }
]

但是,(az group list).getType()返回

PS src> (az group list).getType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

最后,希望拼图的最后2个片段

PS src> (az group list)[0].getType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

因此,az group list的返回类型似乎是array of objects,或者它是object[]的数组,我的能力在这里很刺耳。因此,仔细检查一下,我通过执行... (az group list)[0..10]查询该数组的前10个元素,然后返回bizarely 10 strings!。好的,我知道它应该是10个字符串,只是因为它是一台计算机,如果那是一台计算机,那么那才是真正的字符串。我只是不明白为什么。

[
  {
    "id": "/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/somegroup","name": "admin","type": null

因此,为了简而言之,所有这些都是我想知道的,如何从azure查询的结果中仅选择一个属性?就我而言,我只想显示所有资源组的名称。

az group list | select -p name应该起作用,但是不起作用,我想知道如何正确执行它,并在此过程中找出为什么它不起作用,我们都可以了解有关Azure的知识和强大的过程,生活会很棒!

爱大家, 艾伦

hufu1971 回答:如何从Azure命令“ Powershell中的az组列表”的一系列“结果”中仅选择一个属性?

让我们通过这个工作。当我们指定-o table时,例如:

az group list -o table

我们对Azure PowerShell CLI说,将获取的JSON内容格式化为适合我们的漂亮表。通常,我们不想使用RAW JSON,也不想使用格式化的表。在PowerShell中使用字符串数组也不是一件好事。在PowerShell中,我们希望使用“漂亮”的简单对象。因此,让我们看看获取信息的其他方式。让我们以您的示例为例,然后将其保存到一个我们可以查看的变量中:

$GroupList = az group list

然后,如果我们将其视为类型:

PS C:\> $GroupList.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

实际上,我们有一个对象数组。他们必须是我们小组的成员...对吧?这不是你的想法。如果我们查看数组的大小并返回数组的前几个元素,我们将看到发生了什么事:

PS C:\> $GroupList.Count
125
PS C:\Temp> $GroupList[0..2]
[
  {
    "id": "/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/somegroup",

嗯,那不是我们想要的。该数组实在太大了……查看内容可以发现,我们实际拥有的是JSON 文本每行的数组。这意味着正在运行:

az group list | select -p name

或:

$GroupList | select -p name

是说,遍历数组,仅输出“ Name”属性。由于文本字符串中不存在“名称”属性,因此仅输出空白行。由于文本有几百行,所以我们得到几百行的空白。

那么,为什么PowerShell会接受输入并将其分成由新行分隔的字符串数组?这不是很难使用吗?这不是处理JSON格式文本的“绝佳”方法吗?我们为什么不只得到一根巨大的弦?这不是更容易处理和解析吗?这种奇怪的原因是什么?

使用PowerShell,对管道的支持将决定我们如何输出对象:

  

“主要目的是……提供一种方法来确保管道执行的结果始终是可索引的集合。”   Quote

这就是为什么我们要输出支持数组操作的对象数组的原因(请参阅:@mklement0 answer here for more in depth discussion)。而且,如果我们看一下如何读取和写入文本文件,那么我们可以确切地说明为什么最终会遇到这种特定的 cough 程序员 cough 便利性 cough ...我的意思是奇怪。

要进行设置,我们可以将输出直接通过管道传输到文本文件:

az group list | Out-File -FilePath List.json

哇,等等,那为什么行得通呢? (在这种情况下,我想说PowerShell做 Magic!),我们不必麻烦遍历数组,添加以换行符结尾的字符串以获得一个巨大的连续文本块。以EOF结尾,并且与我们所需的文本文件完全匹配?

真正发生的事情背后的简化原因?好吧,出于程序员的方便, Out-File接收字符串数组,对其进行迭代,并对每个字符串执行简单的File.WriteLine()(对于3行for循环来说不错!)。因此,我们只是生成了一个不错的JSON格式的文本文件,其中包含换行符,而不会费劲。读回去:

PS C:\> $ListFromFile = Get-Content .\List.json
PS C:\> $ListFromFile.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array


PS C:\> $ListFromFile.Count
125

相反。它获取文件,执行File.ReadLine(),将字符串附加到数组,然后返回它。这就是为什么我们最终得到一个包含字符串的对象数组的原因。

现在,我们 真的 想要什么?好吧,我们从一开始就知道,我们不想使用一个巨大的字符串,并且 尤其是 ,我们不想使用对象数组中的字符串,什么呢?我们想要使用的是一个可以访问的不错的本地PSCustomObject。这就是PowerShell最适合的东西,这也是我们最适合的东西。因此,我们只需要转换我们的(大引号)“文本输入”(我们知道其格式为JSON),然后将其转换为对象:

$List = $GroupList | ConvertFrom-Json

并查看计数和属性:

PS C:\> $List.Count
10
PS C:\> $List.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array


PS C:\> $List[0].GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    PSCustomObject                           System.Object

我们看到计数现在与我们拥有的组数匹配,并且类型不再是字符串数组,而是实际的对象。所以... 现在 ,我们可以开始排序和选择:

PS C:\> $List | select -Property Name

Name            
----
group0
group1
group2
group3
group4
group5
group6
group7
group8
group9

我们得到了我们真正想要的输出。

,

哇,这么简单的东西就这么多:

az group list --query '[].name' -o tsv
本文链接:https://www.f2er.com/3149135.html

大家都在问