我在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
任何人都可以解释这种行为吗?为什么将命令括在括号中会使过滤工作?
答案 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对此进行了测试,我可以看到此问题已修复。