2017-01-14 7 views
0

を持っている私は私の紺碧のWebアプリケーションのすべての名前を一覧表示するには、PowerShellで次のように入力します。は、Get-AzureRmWebAppを:フィルタリング結果が予期しない動作

Get-AzureRmWebApp | % { $_.Name } 

それは出力:その後、

coolum-exercise-web-app 
practice-web-app 
AzureSandbox 

しかしをこの出力を名前でフィルタリングしたいと思います。私はこれをタイプする:

Get-AzureRmWebApp | ? { $_.Name -like "coolum-exercise-web-app" } | % { $_.Name } 

私は1つだけの出力を見たいと思う。代わりに私は参照してください

coolum-exercise-web-app 
practice-web-app 
AzureSandbox 

なぜ名前フィルタは適用されませんでしたか?私はGet-AzureRmWebAppに直接-Nameパラメータを使用する場合

は、それが動作します:

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 

誰もが、この動作を説明できますか?括弧で囲んでコマンドを囲むと、フィルタ処理が行われるのはなぜですか? (括弧に注意してください)

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

句をゲット-AzureRmWebAppをするために、デフォルトという名前のパラメータとして考慮され、全体のようになります。

答えて

0

てみてください。そのため、CmdLetと括弧で区切られたwhere節を分離する必要があります。

実際にGet-AzureRmWebAppはリストを返しますが、Get-AzureRmVMのような他のCmdLetは単一のオブジェクトを返します。

Get-AzureRmWebApp | gm 
Get-AzureRmVM | gm 
0

これは既知のバグです:Get-AzureRmWebApp#1544 Get-AzureRmWebApp - unable to pipe into select-object

結果がリストです。あなたはリストの各項目がパイプを介してアイテムごとに送られると期待します。その代わりに、リスト全体が、単一のオブジェクトとして一度パイプを介して送信されます。実証するために

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を持っています。」