ArrayList
ArrayList - тип коллекции PowerShell, динамический массив, который может увеличиваться и уменьшаться по мере необходимости. С помощью ArrayLists можно легко добавлять, удалять, сортировать и обновлять элементы коллекции.
Обычный массив является статическим типом, в котором удаление и добавление элементов осуществляется за счёт создания нового массива.
Создание ArrayLists в PowerShell
$arrayList = New-Object -TypeName System.Collections.ArrayList
или
$ArrayList = [System.Collections.ArrayList]::new() #Список со 100 элементами $ArrayList = New-Object -TypeName System.Collections.ArrayList -ArgumentList 100
Инициализация списка
$ArrayList = [System.Collections.ArrayList]@("Banana", "Cherry", "Apple","Orange")
В отличие от массива по умолчанию, ArrayList может содержать различные типы данных. Например, допустим, вы хотите создать массив ArrayList "Employee" со значениями Employee Number, Employee Name и Date of Join:
1 $Employee = New-Object System.Collections.ArrayList 2 $Employee.Add(001) 3 $Employee.Add("Steve Johnson") 4 $Employee.Add([DateTime]"01/01/2021")
Добавление элементов в список PowerShell ArrayList
После создания списка ArrayList добавлять элементы в список PowerShell ArrayList очень просто с помощью встроенного метода Add(). Этот метод позволяет добавить один элемент в конец списка ArrayList:
1 $ArrayList.Add("Berry")
В качестве альтернативы можно использовать метод AddRange() для ArrayList с набором начальных значений.
1 $Fruits = @("Banana", "Cherry", "Date") 2 $ArrayList.AddRange($Fruits)
Например, чтобы создать список ArrayList, содержащий числа от 1 до 5, вы можете использовать следующий код:
1 $initialValues = 1..5 2 $arrayList = New-Object -TypeName System.Collections.ArrayList 3 $arrayList.AddRange($initialValues)
Вот еще один способ добавить несколько элементов в список массива с помощью цикла:
1 #Create a Array List 2 $ArrayList = New-Object System.Collections.ArrayList 3 4 #Add Elements to Array List 5 @(0..100).ForEach({$ArrayList.Add($_)})
Кроме того, метод Insert() можно использовать для вставки элемента по определенному индексу в ArrayList:
1 $arrayList.Insert(0, "Plums")
Этот код вставит "Plums" в начало списка ArrayList (индекс 0). Помните, что индекс начинается с нуля, то есть первый элемент имеет индекс 0, второй элемент - 1 и так далее.
Вы можете использовать метод GetType() для получения типа данных элемента, хранящегося в ArrayList. Например,
1 $ArrayList[0].GetType().Name
Добавление в список $MyDatabase строку/объект в формате
Name All F1 F2 F3 #Названия полей Первый 4 1 0 0 $null = $MyDatabase.Add( [pscustomobject] @{Name=$MyItem.Name; All=$MyItem.Count; F1=1; F2=0;F3=0 }
Подавление вывода
[void].$ArrayList.Add($ArrayItem) $null = $ArrayList.Add($ArrayItem)
Доступ и извлечение элементов
Чтобы получить количество элементов в ArrayList:
1 $ArrayList.Count
Чтобы получить элемент по индексу:
1 $item1 = $Arraylist[0] 2 $item2 = $Arraylist[1]
Вы можете получить доступ к элементам так же, как и к стандартному массиву PowerShell. Чтобы получить последний элемент:
1 $LastItem = $ArrayList[-1]
Цикл обработки списка ArrayList с помощью Foreach
Чтобы обработать все элементы в ArrayList, используйте Foreach:
ForEach ($Element in $ArrayList) { # Do something with $Element Write-Output $Element }
При этом происходит последовательный перебор каждого элемента. Вы также можете использовать цикл for с Count:
1 For($i=0; $i -lt $Arraylist.Count; $i++) { 2 # Do something with $element 3 $element = $arraylist[$i] 4 Write-host $Element 5 }
Вот еще одна форма:
1 $ArrayList | ForEach-Object { 2 Write-Host $_ 3 }
Изменение элементов списка ArrayList в PowerShell
Если вы создали список ArrayList в своем сценарии PowerShell, есть несколько методов для манипулирования и изменения его элементов. Чтобы изменить значение элемента в ArrayList, вы можете использовать метод set_Item() или нотацию индекса массива. Например, чтобы обновить первый элемент, вы можете использовать
1 $ArrayList.set_Item(0, "Updated Element") 2 3 #Another way 4 $ArrayList[0] = "Updated Element".
Более сложные техники манипулирования, такие как сортировка, реверсирование и поиск, мы рассмотрим в одном из следующих разделов этой статьи.
Удаление элементов из списка массивов PowerShell
Удаление элементов из списка PowerShell ArrayList - это распространенная операция, которую можно выполнить с помощью методов
- Remove()
- RemoveRange()
- RemoveAt()
Независимо от того, хотите ли вы удалить конкретный элемент, несколько элементов или даже очистить весь список, существует метод, который поможет вам сделать именно это. Вот как это делается: Метод Remove() удаляет первое вхождение указанного элемента, а метод RemoveAt() удаляет элемент по определенному индексу.
Например, чтобы удалить первое вхождение элемента "apple" из списка ArrayList, вы можете использовать следующий код:
1 $arrayList.Remove("apple")
Обратите внимание, что приведенный выше метод Remove чувствителен к регистру. Чтобы удалить элемент с индексом 3, можно использовать следующий код:
1 $ArrayList.RemoveAt(3)
Удаление диапазона элементов
Метод RemoveRange позволяет удалить диапазон элементов, указав начальный индекс и количество элементов для удаления:
1 $ArrayList.RemoveRange(0,2) # This will remove the first two elements
Чтобы удалить все элементы из списка ArrayList, используйте метод Clear():
1 $ArrayList.Clear()
Clear() очищает весь список ArrayList. Помните, что эти методы изменяют исходный объект Array List, поэтому используйте их с осторожностью и убедитесь, что вы удаляете правильные элементы.
Сортировка, реверс и поиск в списках массивов PowerShell
PowerShell ArrayList предоставляет несколько методов для манипулирования и обработки данных, таких как сортировка, разворот и поиск. Для сортировки списка ArrayList можно использовать встроенный метод Sort(). Например, чтобы отсортировать список ArrayList чисел по возрастанию, можно использовать следующий код:
1 $ArrayList.Sort()
Чтобы отсортировать список ArrayList строк по убыванию, можно использовать следующий код:
1 $ArrayList.Sort() 2 $ArrayList.Reverse()
Этот код сначала отсортирует ArrayList по возрастанию, а затем изменит порядок, чтобы получить элементы в порядке убывания. Команда Sort-Object также может быть использована для сортировки элементов в массиве:
1 $SortedArrayList = $ArrayList | Sort-Object
Для поиска элемента в ArrayList можно использовать метод Contains(). Например, чтобы проверить, содержит ли ArrayList элемент "apple", вы можете использовать следующий код:
1 if ($ArrayList.Contains("apple")) { 2 Write-Host "ArrayList contains 'apple'" 3 }
Этот код проверит, содержит ли ArrayList элемент "apple", и выведет сообщение, если содержит.
Поиск элемента списка и получение его номера для последующей модификаци
$MyItemID=[Array]::IndexOf(Список, Подстрока поиска)
Преобразование между ArrayList и массивами
Вы можете легко конвертировать между ArrayList и стандартными массивами PowerShell:
Преобразование ArrayList в массив
Чтобы преобразовать список ArrayList в массив, используйте приведение типов как:
1 $Array = [array]$ArrayList
Вы также можете использовать метод ToArray():
1 $array = $arraylist.ToArray()
А как насчет обратного? Чтобы преобразовать существующий массив в ArrayList, используйте:
1 $arraylist = [System.Collections.ArrayList]$array
Массив или ArrayList автоматически приводится к целевому типу.
Преобразование PowerShell ArrayList в строку
Могут возникнуть ситуации, когда вам необходимо преобразовать список PowerShell ArrayList в строку. Это можно легко сделать с помощью оператора -join или метода String.Join(). Например, чтобы преобразовать список строк ArrayList в одну строку, разделенную запятыми, можно использовать следующий код:
1 $string = $arrayList -join ', '
Или с помощью метода String.Join():
1 $string = [System.String]::Join(', ', $arrayList)
Оба метода создадут новую строку, содержащую элементы списка ArrayList, разделенные указанным разделителем (в данном случае запятой и пробелом).
Объединение нескольких списков массивов
Чтобы объединить несколько списков ArrayLists:
1 $arraylist1 = [System.Collections.ArrayList]@(1, 2, 3) 2 $arraylist2 = [System.Collections.ArrayList]@(4, 5, 6) 3 4 $result = $arraylist1.Clone() 5 $result.AddRange($arraylist2)
Clone() создает копию перед добавлением $arraylist2, чтобы избежать изменения оригинала.
Фильтр ArrayList
Вы можете фильтровать элементы в ArrayList с помощью метода Where:
1 #Create a Array List with values: 1 to 10 2 $Values = 1..10 3 $ArrayList = New-Object -TypeName System.Collections.ArrayList 4 $ArrayList.AddRange($Values) 5 6 #Filter Array List 7 $Arraylist = $ArrayList.Where{$_ -ge 5}
Кроме того, для фильтрации элементов массива можно использовать команду Where-Object:
1 #Filter ArrayList 2 $MyArraylist = $ArrayList | Where-Object {$_ -ge 5}
Экспорт списка массивов в CSV
Допустим, у вас есть такой список ArrayList
1 $ArrayList = New-Object System.Collections.ArrayList 2 $ArrayList.Add("Apple") 3 $ArrayList.Add("Banana") 4 $ArrayList.Add("Cherry")
Проблема заключается в том, что этот ArrayList содержит простые строковые данные, а Export-Csv ожидает объекты со свойствами. Чтобы решить эту проблему, можно создать собственный массив объектов из этих простых типов данных, например:
1 #Convert ArrayList to Object array 2 $Objects = $ArrayList | ForEach-Object { [PSCustomObject]@{Fruit = $_} } 3 4 #Export Array to CSV 5 $Objects | Export-Csv -Path "C:\Temp\Fruits.csv" -NoTypeInformation
PowerShell Импорт CSV в список массивов
Вы можете импортировать CSV-файл в список ArrayList с помощью Import-Csv и цикла ForEach.
1 $csvData = Import-Csv -Path 'C:\Temp\Fruits.csv' 2 $ArrayList = New-Object System.Collections.ArrayList 3 4 ForEach ($row in $csvData) { 5 $ArrayList.Add($row) 6 }
Распространенные ошибки и устранение неполадок в PowerShell ArrayList
При работе с PowerShell ArrayList вы можете столкнуться с некоторыми распространенными ошибками или проблемами. В этом разделе мы обсудим некоторые из этих ошибок и дадим советы по их устранению и решению.
- Индекс вне диапазона: Эта ошибка возникает, когда вы пытаетесь получить доступ или изменить элемент с индексом, который не существует в списке ArrayList. Чтобы избежать этой ошибки, всегда убеждайтесь, что используемый индекс находится в пределах границ ArrayList. Вы можете использовать свойство Count, чтобы получить количество элементов в ArrayList.
- InvalidCastException: Эта ошибка возникает, когда вы пытаетесь преобразовать элемент в ArrayList к несовместимому типу данных. Чтобы исправить эту ошибку, убедитесь, что вы используете правильный тип данных для данного элемента, или воспользуйтесь соответствующими методами преобразования, предоставляемыми PowerShell и .NET Framework.
- Добавление элементов с разными типами данных: Хотя в списке ArrayList можно хранить элементы с разными типами данных, это может привести к неожиданному поведению и проблемам с производительностью. Чтобы избежать этого, старайтесь использовать единый тип данных для всех элементов в ArrayList или рассмотрите возможность использования другого типа коллекции, например Hashtable или пользовательского объекта.
Реальные применения PowerShell ArrayList
PowerShell ArrayList можно использовать в различных реальных сценариях, таких как:
- Обработка файлов журналов: ArrayList можно использовать для хранения и обработки данных файла журнала, что позволяет эффективно фильтровать, сортировать и анализировать записи журнала.
- Управление запасами: PowerShell ArrayList можно использовать для хранения и управления данными инвентаризации, такими как имена компьютеров, IP-адреса и сведения об оборудовании.
- Обработка данных: ArrayList можно использовать в задачах обработки данных, таких как разбор CSV-файлов, обработка XML-данных или работа с объектами JSON.
- Оптимизация сценариев: Как уже упоминалось, использование ArrayList может помочь повысить производительность сценариев PowerShell, что делает его ценным инструментом для задач оптимизации сценариев.
- Хранение упорядоченных коллекций, например списков серверов, пользователей и т. д., которые часто меняются.
Сбор результатов циклов и конвейеров перед экспортом в CSV
Заключение
Списки массивов представляют собой мощную альтернативу стандартным массивам PowerShell для хранения динамических коллекций. В этом подробном руководстве мы рассмотрели основные принципы работы со списками массивов PowerShell, от создания и манипулирования до устранения распространенных ошибок этой фантастической структуры данных. Мы также рассмотрели реальные примеры использования и дали советы по оптимизации производительности сценариев. Поняв особенности и преимущества ArrayList, вы сможете легко хранить данные и манипулировать ими динамично и эффективно.
Теперь, когда вы хорошо знаете, что такое ArrayList в PowerShell, пришло время применить полученные знания на практике и начать оптимизировать свои сценарии. Не забывайте следовать лучшим практикам и использовать встроенные методы, предоставляемые ArrayList, чтобы получить максимальную отдачу от ваших сценариев PowerShell.
- Если вы хотите узнать больше о PowerShell ArrayList и других темах PowerShell, изучите следующие ресурсы: Microsoft Docs - Класс ArrayList