Powershell ForEach Loop: универсальный вариант в мире сценариев

Опубликовано: 14 Марта, 2023
Powershell ForEach Loop: универсальный вариант в мире сценариев

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

В этой статье я расскажу о том, что такое ForEach и как его можно использовать в Windows PowerShell. Давайте начнем.

Что такое ForEach?

ForEach — это распространенный механизм циклов в Windows PowerShell. По сути, он считывает объект из коллекции, а затем при необходимости выполняет над ним определенное действие. В конце концов он завершает работу после считывания последнего объекта в коллекции.

С точки зрения программирования эти коллекции часто представляют собой массивы или хеш-таблицы. Массив содержит отдельные объекты, а хэш-таблица содержит набор пар ключ-значение.

Понять механизм можно на простом примере. Допустим, у нас есть массив чисел и мы хотим увеличить каждое значение на 12. То есть мы начинаем с:

Затем мы хотим увеличить значение каждого элемента на 12, чтобы получить:

Изображение 4123

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

В PowerShell у вас есть 3 способа реализации механизма циклов ForEach, и мы рассмотрим каждый следующий.

Способ 1: использование оператора ForEach

Первый вариант — использовать оператор PowerShell ForEach. Это внутреннее ключевое слово PowerShell. Это не функция или командлет. Вместо этого это просто оператор, который сообщает PowerShell о циклическом просмотре массива/хеш-таблицы, выполнение инструкций для каждого объекта в массиве.

Формат или синтаксис оператора ForEach следующий:

Обратите внимание, что слово является зарезервированным словом в PowerShell, и вы должны использовать его в цикле ForEach. Зарезервированное слово имеет фиксированное значение в PowerShell. Вы также не можете изменить или переопределить его .

Возвращаясь к нашему примеру с увеличением значения в массиве на 12, цикл будет выглядеть так:

После выполнения этого кода напечатайте значения в массиве $, и PowerShell отобразит 13,14,15,16,17. Как это работает?

Цикл ForEach начинается с первого элемента 1 и сохраняет этот элемент во временной переменной с именем . Затем цикл добавляет к этому числу 12 на первой итерации. Затем он перейдет к следующему элементу, 2, и добавит 12 к этому числу. Процесс продолжается до тех пор, пока PowerShell не проверит все элементы массива. После добавления 12 к последнему элементу код автоматически выйдет из цикла и перейдет к следующей строке кода.

Этот вариант является вторым по скорости среди трех вариантов, которые я обсуждаю в этой статье. Это быстрее, чем следующий вариант, поскольку PowerShell не нужно искать командлеты или библиотеки. Он может просто выполнить код как есть. Этот вариант также идеален, если вам нужна удобочитаемость.

Теперь перейдем ко второму способу.

Способ 2: командлет ForEach-Object

Второй метод заключается в использовании командлета ForEach-Object, который выполняет определенное действие со всеми элементами в коллекции. На данный момент кажется, что командлет такой же, как опция цикла. Однако, присмотревшись, вы обнаружите, что ввод можно направить непосредственно в командлет. Этот командлет также поддерживает блоки функции Begin, Process или End. Таким образом, вы можете решить, будет ли ForEach выполнять определенное действие до, во время или после инструкций. Вот насколько детально вы можете получить этот командлет.

Давайте рассмотрим пример, чтобы понять, как использовать командлет ForEach-Object.

Вернемся к нашему примеру с 12 приращениями.

Здесь вы берете три целых числа и с помощью командлета добавляете к каждому из них 12. Процесс также отображает результаты для вас. В чем разница между оператором ForEach и командлетом ForEach? Параметр командлета является самым медленным из трех вариантов. Эта разница в производительности не столь заметна в небольших наборах, но может быть существенной в больших наборах.

Теперь давайте рассмотрим более реальный пример цикла PowerShell.

В приведенном выше примере ForEach-Object получает объект процесса из команды . Затем командлет отображает текущую дату и время, значение параметра , а также дату и время после обработки.

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

Метод 3: метод foreach()

Третий вариант — это метод ForEach(). Он стал встроенным методом в каждом массиве после обновления PowerShell до версии 4. Вы также можете выполнять инструкции этого метода для каждого элемента массива.

Возвращаясь к нашему примеру , мы можем написать ту же логику в одной строке.

Чем это отличается от двух других? На первый взгляд все три метода выглядят одинаково и дают одинаковые результаты. Тем не менее, этот метод является самым быстрым среди всех трех вариантов. Скорость, в свою очередь, может иметь большое значение при выполнении сложных операций с большим массивом. Еще одним преимуществом является то, что этот метод также сокращает и сжимает код и позволяет приложениям работать быстрее.

Давайте теперь сравним все три метода визуально.

Обзор методов

Мы рассмотрели три способа использования PowerShell ForEach. Ваш выбор зависит от вашего кода, того, чего вы хотите достичь, и влияния на производительность вашего приложения. Эта таблица даст вам представление о том, какой вариант использовать и когда.

Цель/метод ForEach Заявление командлет Метод ForEach()
Производительность приложения
Входы трубы напрямую
Запуск параллельных скриптов
Читаемость кода

Последние мысли

ForEach — это популярный механизм циклов в PowerShell, который помогает выполнять определенные действия над каждым объектом в коллекции. В этой статье мы узнали 3 способа выполнения этого цикла. Вы хотите выбрать подходящий вариант для своего кода на основе вашей логики программирования и соображений производительности.

Часто задаваемые вопросы

Что такое ForEach в PowerShell?

ForEach — это конструкция языка программирования, позволяющая перебирать элементы в коллекции. Простейшим примером является процесс перебора всех элементов массива и выполнение одного и того же действия над каждым элементом. Этот циклический механизм оптимизирует читаемость кода, производительность приложений и использование памяти.

Могу ли я использовать $_ в цикле PowerShell ForEach?

Да. Вы можете использовать $_ в цикле PowerShell ForEach. Этот $_ обозначает текущий обрабатываемый элемент. Это ввод, на котором выполняются определенные инструкции, описанные в скобках ForEach. Например, Этот параметр работает со всеми методами, появившимися после PowerShell v3.0.

Существует ли несколько способов выполнения цикла ForEach в PowerShell?

Да. У вас есть 3 способа реализовать циклическую конструкцию в PowerShell, а именно оператор ForEach, командлет ForEach-Object и метод ForEach(). Каждый вариант имеет свои плюсы и минусы, поэтому выбор зависит от ваших требований и логики программирования. Например, если вашей целью является удобочитаемость, используйте цикл ForEach. Хотя, если вы хотите передавать входные данные и что-то делать до и после обработки, командлет — ваш лучший вариант. Наконец, если производительность приложения является вашим главным приоритетом, метод ForEach() — ваш лучший выбор.

Командлет ForEach-Object медленнее оператора ForEach и метода ForEach()?

Да. Командлет ForEach-Object — самый медленный из трех вариантов. Это происходит медленно, поскольку командлеты должны подключаться к URL-адресам списка доверия сертификатов Microsoft (CTL) для проверки сертификата. Он будет выполняться только после этого. Оператор ForEach быстрее, а метод ForEach() самый быстрый. Если у вас ограниченные ресурсы, обязательно избегайте метода командлета.

For и ForEach — одно и то же?

Нет. For и ForEach — это разные реализации циклов в PowerShell. Самая большая разница в том, что ForEach может работать только с элементом в коллекции. Цикл For может работать с любыми данными, а не только с элементами коллекции. По сути, оба цикла выполняют одну и ту же функцию, но цикл For более эффективен. Это связано с тем, что цикл For проверяет условие только один раз, а цикл ForEach должен проверять одно и то же условие дважды.