Azure de是一种确保管道执行的结果始终是可索引集合的方法。”

Azure de是一种确保管道执行的结果始终是可索引集合的方法。” ,azure,powershell,Azure,Powershell,这就是为什么我们要输出一组对象(请参见:)来支持管道操作。如果我们看看文本文件是如何读取和写入的,我们可以确切地说明为什么我们最终会出现这种特殊的咳嗽……我的意思是奇怪 要进行设置,我们可以将输出直接传输到文本文件: az group list | Out-File -FilePath List.json 哇,等一下,为什么这样就行了?(在这种情况下,我想说PowerShell有魔力!),难道我们不需要在数组中循环,附加以换行符结尾的字符串,以获得一个以EOF结尾的巨大连续文本块,并且完全匹配

这就是为什么我们要输出一组对象(请参见:)来支持管道操作。如果我们看看文本文件是如何读取和写入的,我们可以确切地说明为什么我们最终会出现这种特殊的咳嗽……我的意思是奇怪

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

az group list | Out-File -FilePath List.json
哇,等一下,为什么这样就行了?(在这种情况下,我想说PowerShell有魔力!),难道我们不需要在数组中循环,附加以换行符结尾的字符串,以获得一个以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最适合使用的,这就是w我们最擅长使用的是什么。因此,我们只需将我们的(大空引号)“文本输入”转换为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

太棒了!除了简单地“向上投票”并标记为“回答”之外,还有什么方法可以表达更多的感谢吗?:D咧嘴笑!总结一下您刚才所说的,我们得出了
(az group list |转换自json).Name
让人困惑的是,响应不是json。它是一个字符串数组,代表json文件中的json行,每行一个字符串,而不是json表示的集合中的每项一个字符串。你是对的,原始描述不是100%准确,我忘了添加…(大空引号)“文本输入"... ;-)... 但是,作为旁白,你确实提出了一个很好的观点。我一般把它称为“文本”,没有什么特别的,因为我就是这样对待它的,我把它当作一块文本(即使它被分割成一个不可用的凌乱对象数组)。我在答案中添加了更多信息,以探究数据为何会变成这种“奇怪”的格式。+100用于解释Powershell中凌乱字符串的精彩描述。Powershell是一种非常奇怪的野兽,它假装是“可探索的”,但却充满了最荒谬的边缘案例,无法进行任何推理。如果你试着去探索和思考,10次中有9次,你会得到知识的回报,第十次。。。powershell会把你关在地牢里。PS通过地球上最友好的开发者社区弥补了这一点!(心)哈哈哈!我知道正确:D公平地说,我的问题特别要求知道为什么,也就是说,从中学习一些东西,并了解所有不同类型的产品到底会带来什么@HAL9256一步一步地完美地解释了它。这非常有趣,而且这个特定的问题经常出现,因此值得我们思考一下。如果您解释一下为什么使用“[].name”的--query会神奇地工作,那么知道为什么会有助于powershell的其他用途,我将支持您的答案。
(az group list | convertfrom json)。name
是“所有文本”的简写版本:
--query
是JMESPath(jason查询路径语法),而object[](字符串)的数组可以使用
JMESPath
查询是否是由于执行
az组列表而导致的
没有其他原因?有什么我们可以从中学习,我们可以使用其他命令吗?输出
-o
被指定为
制表符分隔值
,如果通过管道传输到另一个命令中会导致困难吗?我不确定你在说什么,你得到的是一个字符串数组,没有发生意外情况。如果您将它们作为json处理,您将得到可以操作的对象。但这是过度工程。您可以使用Az Cli syntax获得一个名称列表。在测试这两个建议的解决方案时,我观察到的最后一件事是,您需要将convertfrom json方法括在括号中,否则不会得到任何结果。因此,这可以
(az组列表|从json转换)|选择id、位置
。这不会
az组列表| convertfromjson |选择id、位置
(返回零记录)。最后,要指出的是,如果您没有使用powershell,例如,您在bash中运行查询作为azure构建步骤的一部分,那么请使用@4c74356b41方法,这样您就不需要2个shell来运行powershell。
$GroupList | select -p name
az group list | Out-File -FilePath List.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
$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