Как создать и заполнить массив в 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"
}