Loading

Get the ID for the destination folder to store VM

13.08.2015 - 12:47

В нашем гипервизоре используется сложная структура папок для хранения виртуальных машин. Также, существует разделение на тестовую и продуктивную среду, где структура почти одинаковая. Проблема поиска папки для ВМ состоит в том, что при поиске по определённому имени, гипервизор находит ВСЕ каталоги с таким именем и подставляет первый. Каждый из каталогов имеет свой уникальный идентификатор. Функции поиска конечного каталога по пути к нему нет, поэтому пришлось использовать что-то своё.
Путь я подаю в виде цепочки папок, разделённых символом "|": Cloud PROD Tier|Wintel TEST & DEVELOPMENT|Temp

$Path = ("Cloud PROD Tier|Wintel TEST & DEVELOPMENT|Temp").Split('|')
#получаем информацию про датацентр
$Datacenter = Get-Inventory -Location (Get-Folder -Name Datacenters -NoRecursion) -NoRecursion
#получаем информацию про корневой каталог датацентра. Там находятся 4 типа каталогов, отвечающих за ресурсы, сети, ВМ и ещё что-то, не помню точно. Нам нужен ВМ.
$root = Get-Inventory -Location $Datacenter -NoRecursion | where {$_.type -eq "VM"} #Get-Inventory -name VM -Location $Datacenter -NoRecursion
#Так как мы вначале поделили полный путь на папки (Split), то ищем каждый следующий каталог в предыдущем:
for($i=0; $i -lt $Path.Count; $i++)
{
    #Если в текущем каталоге находится каталог, имя которого совпадает с именем следующего каталога в массиве, то:
    if((Get-Inventory -Location $root -NoRecursion | select -ExpandProperty Name) -contains $Path[$i])
    {
        #переходим на следующий каталог, путём замены объекта в переменной root с текущего на найденный
        $root = Get-Inventory -Name $Path[$i] -Location $root -NoRecursion
    }
    else
    {
        #в случае, если необходимый каталог не обнаружен (очепятка) - передаем в переменную root корневой каталог датацентра и прерываем цикл, так как смысла продолжать нет
        $root = $Datacenter
        break
    }
}
#выводим полную информацию про найденный объект "каталог", который потом можно использовать в других командах
$root | fl

Голосов пока нет