我在Powershell中输入以下内容,以列出我所有的蔚蓝web应用程序的名称:
Get-AzureRmWebApp | % { $_.Name }它的产出如下:
coolum-exercise-web-app
practice-web-app
AzureSandbox但是,我想在名称上过滤这个输出。我键入以下内容:
Get-AzureRmWebApp | ? { $_.Name -like "coolum-exercise-web-app" } | % { $_.Name }我只希望看到一个输出。相反我看到了
coolum-exercise-web-app
practice-web-app
AzureSandbox为什么没有应用名称过滤器?
如果我直接在-Name上使用Get-AzureRmWebApp参数,它可以工作:
Get-AzureRmWebApp -Name "coolum-exercise-web-app" | % { %_.Name }产出:
coolum-exercise-web-app但是为什么where-object不能按照预期应用过滤器呢?
下面是一些非常令人费解的行为:如果将Get-AzureRmWebApp封装在括号中,过滤器就会像您预期的那样工作。
(Get-AzureRmWebApp) | ? { $_.Name -like "coolum-exercise-web-app" } | % { $_.Name }产出:
coolum-exercise-web-app有人能解释一下这种行为吗?为什么将命令括在括号中使过滤工作?
发布于 2017-01-14 20:55:37
这是一个已知的bug:#1544 Get-AzureRmWebApp -无法进入select对象
Get-AzureRmWebApp的结果是一个列表。您将期望列表的每一项都通过管道逐项发送。相反,整个列表只作为一个对象通过管道发送一次。
展示:
Get-AzureRmWebApp | % { $_.GetType().FullName }显示
System.Collections.Generic.List`1[[Microsoft.Azure.Management.WebSites.Models.Site, Microsoft.Azure.Management.Websites, Version=1.0.0.2, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]而
(Get-AzureRmWebApp) | % { $_.GetType().FullName }显示
Microsoft.Azure.Management.WebSites.Models.Site
Microsoft.Azure.Management.WebSites.Models.Site
Microsoft.Azure.Management.WebSites.Models.Site这个错误的发生是因为底层C#代码调用WriteObject(sendToPipeline = list),而它应该调用WriteObject(sendToPipeline = list,enumerateCollection = true)。
将调用包装在括号中的操作将返回的列表分配给本地临时对象。然后,这个本地临时对象的行为就像一个普通的列表。
我希望Azure团队能够解决这个问题,因为这将给不幸的自动化脚本编写人员带来意想不到的后果。
例如,我最初的电话:
Get-AzureRmWebApp | ? { $_.Name -like "coolum-exercise-web-app" } | % { $_.Name }被解释为“如果任何值的都有类似于coolum-exercise-web-app的Name,则显示所有的值。”
编辑(2019年3月)
我已经用Azure Az Powershell模块对此进行了测试,我可以看到这个问题已经解决了。
https://stackoverflow.com/questions/41647719
复制相似问题