пятница, 9 февраля 2018 г.

PowerCLI. Get-View. Использование фильтров. Регулярные выражения.

Использование фильтрации вывода результатов командлета Get-View задача не очень простая. В том плане, что обычные приемы, применяемые как в случае с PowerCLI, так и PowerShell не всегда срабатывает. 


Выведем список всех ВМ
get-view -viewtype VirtualMachine | select name

Если используем фильтр по имени
get-view -viewtype VirtualMachine -filter @{"Name"="DHCP"} | select name
то получим одну ВМ.


Но если выполним 
get-view -viewtype VirtualMachine -filter @{"Name"="TestVM"} | select name
То имеем в выводе уже четыре ВМ, которые содержат в своем имени символы "TestVM".





В случае с Get-View мы не можем использовать обычные операторы, как-то "равно - не - равно" (-eq-ne), поэтому воспользуемся регулярными выражениями.

Регулярные выражения (Regular Expressions, RegExp)  — это специализированный язык для поиска и обработки текста. Основой регулярных выражений являются управляющие символы (метасимволы), а само регулярное выражение по сути является шаблоном, определяющим правила поиска.

Используем \z 
get-view -viewtype VirtualMachine -filter @{"Name"="TestVM\z"} | select name

В данном примере мы указали, что хотим вывести все ВМ, имя которых заканчиваются на TestVM.
Можно использовать следующие равнозначные символы: $, \Zили \z

Как нам получить только ВМ с именем "TestVM"?
Используем дополнительно символ крышки ^
get-view -viewtype VirtualMachine -filter @{"Name"="^TestVM\z"} | select name
Теперь мы получили ВМ, которая называется именно TestVM.
И фильтр буквально означает следующее: начало строки, TestVM, конец строки.



Теперь выведем все ВМ, имена которых не содержат TestVM, для чего используем квадратные скобки [] и ^
get-view -viewtype VirtualMachine -filter @{"Name"="[^TestVM]"} | select name


В статье PowerCLI. Использование Get-View. Часть 2. я упоминал что использование фильтра в выражениях довольно сложно, с использованием регулярных выражений мы можем сделать то, что операторами сравнения у нас тогда не получалось. 
Получим список всех не включенных ВМ. 
get-view -viewtype VirtualMachine -filter @{"Runtime.PowerState"="[^poweredOn]"} | select Name,@{ Name="PowerState"; Expression={$_.Runtime.PowerState}}

Как видим, в этот список вошла и приостановленная ВМ. Т.е. фильтр отработал корректно.

Но если мы захотим вывести все ВМ, кроме, например New-TestVM
get-view -viewtype VirtualMachine -filter @{"Name"="[^New-TestVM]"} | select name
то получим ошибку - мол в перечислении "от w до T" ([^New-TestVM]  w в алфавите стоит после T. Объяснить фильтру что знак "-" - это вовсе не перечисление у меня не получилось.

При этом использование дефиса в "обычном", выражении, отрабатывает как надо:


get-view -viewtype VirtualMachine -filter @{"Name"="^New-TestVM"} | select name

Давайте получим все ВМ, имена которых содержат только буквы латинского алфавита, причем этих букв 5
get-view -viewtype VirtualMachine -filter @{"Name"="^[a-z]{5}$"} | select name
Как видим, в вывод не вошла ВМ с именем AD-CS.

А теперь выведем давайте получим все ВМ, имена которых содержат только буквы латинского алфавита, но этих букв от 1 до 5
get-view -viewtype VirtualMachine -filter @{"Name"="^[a-z]{1,5}$"} | select name

На этот раз мы воспользовались квантификаторами.
Квантификаторы позволяют указывать диапазон в формате {x,y}, где х — минимально необходимое, а у — максимально возможное количество символов

Все ВМ, имена которых заканчиваются на цифры
 get-view -viewtype VirtualMachine -filter @{"Name"="[0-9]$"} | select name
или
 get-view -viewtype VirtualMachine -filter @{"Name"="\d$"} | select name
Все ВМ, имена которых содержит пробел
get-view -viewtype VirtualMachine -filter @{"Name"="[ ]"} | select name
или
get-view -viewtype VirtualMachine -filter @{"Name"="\s"} | select name
Все ВМ, имена которых заканчиваются на цифры
 get-view -viewtype VirtualMachine -filter @{"Name"="[0-9]$"} | select name

Еще одна конструкция, о которой необходимо упомянуть - это Альтернатива
Символ | (вертикальная черта) в регулярных выражениях означает «или» и позволяет выбрать один из нескольких вариантов.


Вернемся к выводу виртуальных машин с именами, содержащими TestVM
get-view -viewtype VirtualMachine -filter @{"Name"="TestVM"} | select name
Данный вывод не содержит ВМ "Test_VM_3". Давайте выведем и эту ВМ.
get-view -viewtype VirtualMachine -filter @{"Name"="TestVM|Test_VM"} | select name


Комментариев нет:

Отправить комментарий