2017-01-14 4 views
0

я введите в Powershell, чтобы перечислить имена всех моих лазурных веб-приложений:Get-AzureRmWebApp: результаты фильтрации имеет неожиданное поведение

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

Пожалуйста, попробуйте: (обратите внимание на скобки)

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

Похоже, в целом, где положение рассматривается как параметр по умолчанию для имени Get-AzureRmWebApp. Вот почему вы должны отделить CmdLet от предложения where с помощью скобок.

Фактически Get-AzureRmWebApp возвращает список, тогда как другой CmdLet, такой как Get-AzureRmVM, возвращает один объект.

Get-AzureRmWebApp | gm 
Get-AzureRmVM | gm 
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 } 

получает интерпретируется как «Если любой значений имеет Name как coolum-exercise-web-app, а затем отобразить все значения.»

 Смежные вопросы

  • Нет связанных вопросов^_^