Использование фильтрации вывода результатов командлета 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