Get-AzureRmWebApp:过滤结果具有意外行为

时间:2017-01-14 07:20:11

标签: azure azure-web-sites azure-powershell

我在Powershell中输入以下内容,列出我所有azure 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

任何人都可以解释这种行为吗?为什么将命令括在括号中会使过滤工作?

2 个答案:

答案 0 :(得分:0)

请尝试:(注意括号)

(Get-AzureRmWebApp) | ? { $_.Name -like 'cool*' }

看起来整个where子句被视为Get-AzureRmWebApp的默认命名参数。这就是为什么你必须用括号从where子句中分离CmdLet的原因。

实际上Get-AzureRmWebApp返回一个列表,而其他CmdLet(如Get-AzureRmVM)返回一个对象。

Get-AzureRmWebApp | gm
Get-AzureRmVM | gm

答案 1 :(得分:0)

这是一个已知错误:#1544 Get-AzureRmWebApp - unable to pipe into select-object

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 }

被解释为&#34;如果任何值的Name类似coolum-exercise-web-app,则显示所有值。&#34;

编辑(2019年3月)

我已使用Azure Az Powershell Modules对此进行了测试,我可以看到此问题已修复。