понедельник, 29 января 2018 г.

PowerCLI. Использование хеш таблиц (hash tables).

В прошлых статьях я рассказал как можно одной командой вывести значения, которые содержатся на разных уровнях вложенности. Например значения из Сonfig.tools и .Guest вывода командлета Get-View -ViewType VirtualMachine. Несомненно это очень удобно - вместо последовательного выполнения этих командлетов и выискивания глазами интересующих нас полей мы получаем все в одном месте, и при этом не видим ничего лишнего.








Также я привел вывод команд 

$VM.Summary.Guest
$VM.Guest

Обратив внимание на более компактный вид команды $VM.Summary.Guest.

И вот на следующем этапе нам, вероятно, захочется вывести значения не по двум, а скажем по шести полям. И поскольку мы понимаем, что вывод будет весьма громоздким, мы зададимся вопросом: А можно ли создать свой собственный Summary, или даже множество различных вариантов Summary из интересующих нас значений, и так же аккуратно вывести его в один столбец?
Оказывается можно! И этот инструмент называется хеш таблицы.

Хеш таблицы (hash tables).

- это специальная структура данных для хранения пар ключей и их значений.

Для ее создания достаточно ввести $VM_Prop = @{}. Все, мы создали новый объект - пустую хеш таблицу.


Выполнив
$VM = get-view –viewtype VirtualMachine –filter @{“Name”=”DHCP”}
мы получим доступ к элементу $VM.Name, что и будет нашим самым первым значением. А ключом назначим VmName.

Выполним
$VM_Prop["VmName"]=$VM.Name  

Теперь наша таблица не пустая!

Прежде чем перейти к тому, ради чего собственно мы и обратились к хеш таблицам, еще немного теории.

Наша переменная $VM_Prop содержит объект: хеш таблицу.
И мы может посмотреть элементы этого объекта, выполнив
 $VM_Prop | get-member  
Вывод содержит методы (что можно сделать) и свойства. 
На данный момент нас интересуют только свойства 
 $VM_Prop | Get-Member -MemberType Properties
Извлечем свойства Values и Keys
В приведенном скриншоте видим ранее введенные нами значения.
Также видно, что мы действительно создали объект Hashtable



Теперь перейдем к практическому использованию технологии, с которой мы только что ознакомились.
Будем использовать следующий вид записи нашего объекта: 
$VM_Prop = @{
     VmName=$VM.Name
      NameOS=$VM.Summary.Guest.HostName
      IP=$VM.Summary.Guest.IpAddress
     ToolsVersion=$VM.config.Version
     ToolsUpgrade=$VM.config.tools.ToolsUpgradePolicy
     ToolStatus=$VM.Guest.ToolsVersionStatus

}
Создав хеш таблицу и заполнив ее, выведем ее значения:
$VM_Prop
Обратим внимание на порядок вывода полей, - он не соответствует тому, как мы определили в таблице.
Это решается использованием свойством [ordered]
$VM_Prop = [ordered]@{
     VmName=$VM.Name
      NameOS=$VM.Summary.Guest.HostName
      IP=$VM.Summary.Guest.IpAddress
     ToolsVersion=$VM.config.Version
     ToolsUpgrade=$VM.config.tools.ToolsUpgradePolicy
     ToolStatus=$VM.Guest.ToolsVersionStatus
}


Теперь порядок вывода полностью соответствует порядку ввода. 
Когда мы рассматривали вопрос использования Хеш таблицы для создания своего собственного компактного вывода нужных нам элементов, мы использовали ключ MemberType Properties в команде Get-Member для вывода только свойств.
Но поняв, что из себя представляет хеш таблица, мы догадываемся что только красивым и компактным выводом ее использование не ограничивается.
Наберем команду без ключей  
$VM_Prop | Get-Member

Мы видим список доступных методов. Их рассмотрение выходит за пределы данной статьи, однако для демонстрации их возможностей вполне можно ограничиться одним. Например методом Remove.
Выведем исходную таблицу, а затем подредактируем ее с помощью Remove.


Как видно из данного примера созданный нами объект можно легко модернизировать.














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

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