Для начала давайте подробнее посмотрим на механизм, известный в PowerShell как конвейер (pipe, pipeline).
Большинство командлетов (команд) предоставляют некий вывод при своей работе. Например, когда мы запустили Get-VM, был выведен список ВМ, включающий дополнительную информацию. При помощи конвейера мы можем подхватить этот вывод и обработать следующим командлетом, для чего нужно поставить символ | и написать следующую команду. Можно использовать командлет Where-Object, чтобы отфильтровать информацию на основе свойств, предоставленных предыдущим командлетом.
В предыдущем уроке было упомянуто о том, что командлеты имеют свойства и методы, и одним из свойств объектов, возвращаемых командлетом Get-VM является PowerState, которое может быть использовано для нахождения ВМ в определенном состоянии. Итак, если мы хотим найти все выключенные ВМ, то для этого нужно вывод Get-VM перенаправить на вход командлета Where-Object:
Get-VM | Where-Object {$_.PowerState -eq "PoweredOff"}
Когда эта конструкция выполнится, мы получим список выключенных ВМ:
Достаточно изменить команду для фильтрации по "PoweredOn" и мы получим список включенных ВМ:
Как же узнать свойства командлета Get-VM (точнее свойства возвращаемого им объекта), по которым можно осуществлять фильтрацию? Как узнать какие у командлета доступны методы? Все достаточно просто, и делается при помощи того же самого конвейера, достаточно перенаправить желаемый командлет в Get-Member. Для сокращения записи можно использовать алиасы, и соотв. вместо Get-Member можно написать просто gm:
Get-VM | gm
Продолжим идею, и добавим командлет Start-VM, и держу пари, что вы угадаете зачем. Включим все выключенные ВМ, добавив еще один шаг в конвейер:
Get-VM | Where-Object {$_.PowerState -eq "PoweredOff"} | Start-VMПоследнее, что я хочу сделать в этом уроке - пояснить особенности конвейерной обработки. Хотя результат Get-VM выглядит как обычный текст, на самом деле при работе этого командлета формируется список объектов (ВМ в данном случае). Таким образом, командлет Start-VM не пытается стартовать ВМ с именем "SCOM PoweredOff 1 256", он берет имя ВМ из свойства Name объекта, ссылку на который вернул предыдущий командлет. В данном случае это просто "SCOM".
В последующих уроках я попытаюсь объяснить что такое объекты, поскольку PowerShell объектно-ориентированный язык.
<< Предыдущий урок | Следующий урок >>
Спасибо!
ОтветитьУдалитьБуду очень признателен, если Вы рассмотрите управление снапшотами через PowerCLI в следующих материалах. Иногда возникает ситуация, когда машина, после миграции, занимает очень много места, а через gui проблема не решается никак, кроме клонирования.