Как создать и заполнить массив в Powershell на основе динамической переменной?

Я боролся с этим в течение нескольких дней, и я не уверен, как победить это. Мне нужно сделать следующее:

Импортируйте CSV пользователей со следующими значениями:

ID, имя, регион

Создайте массив на основе значений Region, которые я затем смогу использовать для заполнения идентификаторами и именами этого региона, т.е.

Array_SEA

AA_SCOM, Адам Эндрюс, SEA

Array_OAK

BB_SCOM, Боб Баркер, ДУБ

Вот код, который я получил прямо сейчас:

$list2 = ipcsv .\TSE_Contact_List.csv | sort-object BU

$arraylist =@()

foreach ($vitem in $list2)
{
$arraylist += New-Object PsObject -Property @{'Array' = "Array_" + $vitem.bu}
}
foreach ($varray in $arraylist)
{
$arr = new-variable -Name $varray
$arr.value += $varray.array
$arr
}

Это приводит к следующей ошибке для записей с дублирующимися областями: Новая переменная: переменная с именем '@{Array=Array_SCA}' уже существует.

Я также получаю следующее, когда он пытается добавить значения: Свойство 'значение' не может быть найдено для этого объекта; убедитесь, что он существует и может быть установлен.

Я понял, что на самом деле я не создаю массивы во втором разделе, но я не уверен, как передать выходные данные переменной в имя массива, не превращая объявление переменной в имя массива, если это имеет смысл.

Я пробовал следующее с хеш-таблицами, и это становится ближе:

$list2 = ipcsv .\TSE_Contact_List.csv | sort-object BU

$arraylist =@{}

foreach ($vitem in $list2){$arraylist[$vitem.bu] = @()}

foreach ($record in $list2)
{
$arraylist[$vitem.bu] += ($record.SCOMID,$record.Name,$record.BU)
Write-host "Array: "
$arraylist[$vitem.bu]
write-host ""
}

Вывод этого не показывает ошибок, но он просто показывает добавленные поля для всех записей для каждой итерации списка, поэтому я не думаю, что он фактически присваивает каждому уникальному BU имя массива.

1 ответ

Мне нравится подход hashtable, но я бы немного подстроил его. Пытаться:

$list2 = ipcsv .\TSE_Contact_List.csv | sort-object BU

$arraylist = @{}

foreach ($vitem in $list2){
    if($arraylist.ContainsKey($vitem.BU)) {
        #Array exists, add item
        $arraylist[($vitem.BU)] += $vitem
    } else {
        #Array not found, creating it
        $arraylist[($vitem.BU)] = @($vitem)    
    }
}

#TEST: List arrays and number of entries
$arraylist.GetEnumerator() | % {
    "Array '$($_.Key)' has $($_.Value.Count) items"
}

Вы также можете использовать Group-Object лайк:

$list2 = ipcsv .\TSE_Contact_List.csv | Group-Object BU

#TEST: List groups(regions) and number of entries
$list2 | % {
    "Region '$($_.Name)' has $(@($_.Group).Count) items"
}
Другие вопросы по тегам