Довольно часто, при написании сценариев PowerShell, вам нужен способ хранения набора элементов. Одним из общих способов достижения этого является использование массива или конкретного типа, известного как ArrayList. Но что такое массив вообще? Массив – это структура данных, предназначенная для хранения коллекции элементов. Это может включать в себя элементы одного и того же типа или разных типов.
Массивы используются во многих различных языках программирования, и PowerShell не исключение. Существует множество способов создания, обработки и оптимизации массивов. В этой статье вы узнаете о ArrayLists, массивах и коллекциях, а также о некоторых bewтых практиках их использования в PowerShell.
Предварительные требования
Поскольку вы будете работать только с самим языком PowerShell, нет необходимости в окружающих условиях. Вам просто нужен компьютер с Windows и установленным PowerShell, а именно:
- Windows PowerShell 3 или более поздняя версия
- .NET Framework 4.5 или более поздняя версия
Хотите получать больше подсказок? Загляните на мой личный блог PowerShell по адресу: https://nkasco.com/FriendsOfATA
Создание массивов с помощью PowerShell
Существует много различных способов создания массивов с помощью PowerShell. Допустим, у вас есть список имен, которые вам нужно как-то обработать, как показано ниже.
Создание массивов с использованием разделенных запятыми элементов
Самый простой способ создать массив – просто присвоить известные входные данные, разделенные запятыми, переменной, как показано ниже.
Если вы запустите метод GetType()
, доступный для всех объектов в PowerShell, вы увидите, что вы успешно создали массив, как указано свойством BaseType
, показанным ниже.
Используя оператор подвыражения
Вы также можете создавать массивы в PowerShell с помощью оператора подвыражения. Этот концепт часто используется, когда вы не знаете, сколько элементов будет добавлено в ваш массив. Результат может содержать ноль или много элементов при создании.
Обратите внимание, что ниже создан массив с именем $MyArray
с нулевым количеством элементов внутри.
Используя оператор диапазона
Массивы не ограничиваются хранением строк, как показано выше. Вы также можете создавать массивы с другими типами объектов, такими как целые числа.
Если вам нужен массив целых чисел в последовательном порядке, вы можете воспользоваться укороченным путем и использовать диапазон оператор ..
. Ниже вы можете видеть, что массив был создан с целыми числами от 2 до 5 всего одной строкой кода.
Создание коллекций PowerShell ArrayList
Использование коллекции PowerShell ArrayList – это также способ хранения списка элементов в PowerShell. Класс ArrayList является частью пространства имен System.Collections в .NET. Создав новый объект этого типа, вы затем можете хранить объекты внутри ArrayList.
Ниже вы можете видеть, что вам нужно явно создать объект ArrayList с использованием cmdlet New-Object
или приведя стандартный массив к объекту ArrayList.
Обратите внимание, что в этом случае BaseType
является объектом, тогда как в приведенных выше примерах BaseTypes Arrays, которые наследуются от класса Object. В конечном итоге PowerShell предоставляет доступ к системе типов .NET.
Добавление элементов в массив
При создании массива вы можете либо определить все элементы во время создания, либо добавить их по мере необходимости.
Чтобы добавить элементы в существующую коллекцию, вы можете использовать оператор +=
или метод Add
. Однако знайте, что между ними есть существенные различия в работе.
При создании стандартного массива с помощью @()
вы будете использовать оператор +=
, но для добавления элементов в ArrayList вы будете использовать метод Add
. Эти методы отличаются тем, что оператор +=
фактически уничтожает существующий массив и создает новый с новым элементом.
Чтобы продемонстрировать, ниже вы увидите, что можете обратиться к свойству IsFixedSize
для массива или ArrayList, чтобы узнать, какой из них неизменяемый, а какой — нет.
Поскольку основной массив является коллекцией фиксированного размера, вы не можете его изменить.
Попытка использовать метод Add()
с массивом фиксированного размера приведет к ошибке из-за его фиксированного размера. Ниже вы можете увидеть несколько примеров, в которых вы можете успешно добавлять элементы в массив.
Удаление элементов из массива
Теперь, когда у вас есть лучшее понимание того, как добавлять элементы в массив, давайте рассмотрим несколько способов удаления элементов из массива.
Поскольку базовый массив фиксированного размера, вы не можете удалять из них элементы. Вместо этого вам придется создать совершенно новый массив. Например, вы можете удалить один элемент из массива, создав условное выражение, которое соответствует только тем элементам, которые вы хотели бы включить. Приведен пример ниже.
Поскольку ArrayList не имеет фиксированного размера, вы можете удалять из него элементы с помощью метода Remove()
. Это один из случаев, когда использование ArrayList может быть вам выгодно, если вы планируете часто добавлять/удалять элементы.
Извлечение определенных элементов из массива или ArrayList
Для извлечения определенных элементов из массива или ArrayList можно использовать множество различных методов. Как и в случае с другими объектами в PowerShell, вы можете получить доступ ко всем элементам массива, просто вызвав объект.
Возможно, вам нужно извлечь только первый элемент, массивы всегда имеют начало с 0, что представляет собой первый элемент массива. Чтобы извлечь первый элемент массива, укажите номер индекса в квадратных скобках, как показано ниже.
Наоборот, вы также можете ссылаться на индексы в обратном порядке, используя тире (отрицательный индикатор), чтобы получить последние X элементов из массива. Общий способ найти последний элемент в массиве – использовать -1
, как показано ниже.
Оператор диапазона, о котором вы узнали выше, также может использоваться для извлечения объектов массива, следуя тому же методу вызова элементов. Допустим, вы хотите извлечь первые четыре имени из массива $BasicArray
.
Как видно ниже, можно указать диапазон индексов 0-3, который вернет первые четыре элемента.
Оптимизация массивов с PowerShell
Теперь, когда у вас есть хорошая основа того, как создавать и манипулировать массивами, какой из них следует использовать? Чтобы ответить на это, давайте рассмотрим несколько примеров с помощью cmdlet Measure-Command
. Используя cmdlet Measure-Command
, вы лучше поймете, как долго выполняются команды по обработке элементов по мере их передачи по конвейеру.
В общем, если у вас небольшая коллекция объектов, вы, вероятно, не заметите большой разницы в том, как вы манипулируете своими массивами. Однако, если у вас большая коллекция объектов, важно понимать различия для достижения оптимальных результатов.
Давайте применим то, что вы только что узнали в предыдущем разделе о разнице между +=
и использованием метода Add()
с циклом из 50 000 элементов.
Сначала создайте пустой массив и пустой ArrayList, как показано ниже.
Затем заполните 50 000 элементов в каждой коллекции, используя оператор диапазона и цикл foreach, как показано ниже.
Наконец, оберните свои команды в выражение и передайте это выражение в cmdlet Measure-Command
. Исполнив выражение с помощью Measure-Command
, вы можете увидеть, сколько времени на самом деле занимает каждый процесс.
Имейте в виду, что, как вы узнали ранее,
+=
фактически создает новый массив, а не добавляет к фиксированному.
Результат? Почти 60 секунд против 139 миллисекунд!
Как видите, намного быстрее использовать ArrayList для больших коллекций, чем использовать массив фиксированного размера.
Хотя это базовый пример, он подчеркивает важность понимания того, что ваш код делает во время обработки. Если это не понимается должным образом, это может привести к негативному пользовательскому опыту.
Если у вас есть какой-либо существующий сценарий, который мог бы получить выгоду от использования ArrayList вместо массива, это представляет отличную возможность для ночного улучшения!
Дополнительные материалы
- Сравнение массивов с помощью PowerShell
- Как создавать массивы для повышения производительности в PowerShell (MCPmag)
Хотите больше подсказок в этом роде? Загляните на мой личный блог по PowerShell по адресу: https://nkasco.com/FriendsOfATA.