В этой статье мы рассмотрим PowerShell Циклы For, While, Do-While и Do-Until. Я поясню, как создаются циклы в PowerShell и как определить условия для входа в цикл или его завершения.
Цикл For в PowerShell
Цикл For – это цикл счетчика, который преимущественно используется, когда необходимо повторить задачу определенное количество раз, обработать коллекцию или указать элементы по индексному номеру. Он продолжается, пока условие проверки оценивается как true, и завершается при false.

Синтаксис цикла For следующий:
for (<Init>; <Condition>; <Repeat>) { <Script Block> }
- Блок <Init> выполняет команду или набор команд перед началом цикла. Обычно это место, где вы инициализируете переменную счетчика.
- В разделе <Condition> вы оцениваете условное тестирование. Если оно true, вы входите в цикл и выполняете команды в блоке скрипта. Затем условие оценивается снова до тех пор, пока не станет false.
- Заменитель <Repeat> выполняет одну или несколько команд, разделенных запятыми на каждой итерации цикла. Обычно он используется для изменения переменной счетчика.
Если вы хотите повторить определенную операцию пять раз, воспользуйтесь следующим примером:
Узнайте, какие конфиденциальные данные хранятся где, оцените риски, связанные с ними, и внедрите меры по защите данных на основе политики с DataSecurity Plus, программным обеспечением по защите данных от ManageEngine. Начните сегодня с полностью функциональной бесплатной пробной версии на 30 дней.
for ($var = 1; $var -le 5; $var++) { Write-Host The value of Var is: $var } Write-Host End of for loop.

Здесь переменная инициализируется значением 1, которое меньше 5, поэтому вы входите в цикл и выполняете блок скрипта. На каждой итерации значение переменной увеличивается на 1 и оценивается по условию, пока результат не станет ложным.
Так как условие оценивается в начале, если результат ложный, блок команд не будет выполнен:
for ($var = 6; $var -le 5; $var++) { Write-Host The value of Var is: $var } Write-Host End of for loop.

При необходимости вы можете использовать логические операторы для указания дополнительных условий. В данном случае мы добавили несколько условий. И потому что логический оператор -и возвращает значение истина только тогда, когда оба условия истинны, цикл завершается, когда выражение $var -ne 3 достигает состояния ложь.
for ($var = 1; $var -le 5 -and $var -ne 3; $var++) { Write-Host The value of Var is: $var } Write-Host End of for loop.

Как упоминалось ранее, вы можете выполнять одну или несколько команд в заполнителях <Инициализация> и <Повторение>. В приведенном ниже примере у нас есть переменная $var1 с начальным значением 1, которое увеличивается, и ее значение оценивается для проверки, меньше ли оно или равно 5.
Однако у нас также есть вторая переменная, $var2. Она имеет начальное значение 5, которое уменьшается, но не оценивается как часть условия.
for (($var1 = 1), ($var2 = 5); $var1 -le 5; ($var1++), ($var2--)) { Write-Host The value of Var1 is: $var1 Write-Host The value of Var2 is: $var2 } Write-Host End of for loop.

Как определить условия цикла в PowerShell
В PowerShell команды выполняются последовательно. Но иногда вам может потребоваться повторить команду или набор команд до тех пор, пока не будет выполнено определенное условие. Это называется цикл.
Для определения условий входа или выхода из цикла в PowerShell вам необходимо использовать операторы сравнения. Они позволят вам сравнивать значения или найти значение, которое соответствует определенному шаблону. Результатом будет логическое значение ( true или false), которое оценивается логикой цикла.
Вы можете использовать операторы сравнения для сравнения числовых значений:
Operation | Result |
2 -eq 2 | True |
2 -eq 5 | False |
3 -gt 7 | True |
5 -lt 3 | False |
Также можно сравнивать строковые значения с помощью операторов сравнения:
Определите, какие конфиденциальные данные хранятся где, оцените риски, связанные с ними, и внедрите меры защиты данных на основе политики с DataSecurity Plus, программным обеспечением для защиты данных ManageEngine. Начните прямо сегодня, воспользовавшись полностью функциональной бесплатной пробной версией на 30 дней.
Operation | Result |
‘PowerShell’ -eq ‘powershell’ | True |
‘PowerShell’ -eq ‘cmd’ | False |
‘PowerShell’ -like ‘power*’ | True |
‘PowerShell’ -notlike ‘*shell’ | False |
Цикл Foreach в PowerShell
Цикл Foreach используется для итерации по элементам коллекции. В этом случае нет условия для оценки, но цикл повторяется, пока все элементы коллекции не будут обработаны.
<Figure Foreach_Diagram.png> The syntax for a Foreach loop is the following: foreach ($<item> in $<collection) { <Script Block> }
Здесь мы начинаем со заявления foreach, за которым следуют скобки с переменной и коллекцией для итерации. Затем идет блок сценария для выполнения. Переменная создается автоматически и ей присваивается значение из массива перед каждым выполнением цикла.
Снова, чтобы выполнить цикл пять раз, вам понадобится коллекция из пяти элементов. В этом случае это будут целочисленные значения от 1 до 5:
$collection = 1..5 foreach ($item in $collection) { Write-Host The value of Item is: $item } Write-Host End of foreach loop

Переменная инициализируется первым значением из коллекции, которое равно 1, затем выполняется блок сценария. На следующей итерации переменной присваивается следующий элемент в массиве, который равен 2. Блок сценария обрабатывается снова и снова, пока все элементы в коллекции не будут обработаны.
Например, если вы хотите обработать первые пять служб, работающих на вашем компьютере, ваш цикл будет выглядеть так:
foreach ($service in (Get-Service | Select-Object -First 5)) { Write-Host Service name is: $service.name and status is $service.status }

Следует понимать разницу между циклом Foreach и командой Foreach-Object. Легко их перепутать. Цикл Foreach всегда начинается с заявления Foreach, в то время как команда Foreach-Object будет следовать за командой с конвейером, так как обрабатывает объекты, отправленные через него.
Цикл While в PowerShell
Оператор While в PowerShell используется для создания цикла, который выполняет команду или набор команд, если условие оценивается как true. Он проверяет условие перед выполнением блока скрипта. Пока условие true, PowerShell выполняет блок скрипта до тех пор, пока условие не станет false.

Синтаксис цикла while выглядит следующим образом:
while (<Condition>){<Script Block>}
Например, если у вас есть переменная с именем var с начальным значением 1, и вы хотите повторить цикл пять раз, цикл должен иметь следующую структуру:
Знайте, какие конфиденциальные данные хранятся где, оцените риски, связанные с ними, и внедрите меры защиты данных на основе политики с помощью DataSecurity Plus, программного обеспечения по защите данных от ManageEngine. Начните сегодня с полностью функциональной бесплатной пробной версии на 30 дней.
$var = 1 while ($var -le 5) { Write-Host The value of Var is: $var $var++ } Write-Host End of While loop.

В приведенном выше примере переменная инициализируется за пределами цикла и инкрементируется в блоке скрипта. Команда Write-Host используется для вывода значения переменной на каждом цикле цикла.
Важно отметить, что если условие изначально false, то цикл не будет запущен. В нашем примере, если у переменной было бы значение (var = 6), то команда цикла вообще не сработала бы и блок скрипта не был бы выполнен.
$var = 6 while ($var -le 5) { Write-Host The value of Var is: $var $var++ } Write-Host End of While loop.

Можно использовать более сложные условия с помощью логических операторов. Например, если вы хотите, чтобы переменная была меньше 5 и не равна 3, цикл будет выглядеть так:
$var = 1 while ($var -le 5 -and $var -ne 3) { Write-Host The value of Var is: $var $var++ } Write-Host End of While loop.

Как упоминалось ранее, при использовании логического оператора -and, результат будет true только в случае, если оба условных теста оцениваются как true. В данном случае, когда переменной присваивается значение 3, второе условие становится false: Это приводит к результату false, останавливающему цикл.
Цикл PowerShell Do-While
A Do-While loop is a variant of the While loop, and the main difference is that the script block is executed before the condition is checked. This means that even if the start condition is false, the script block will be executed at least once.

Синтаксис цикла Do-While выглядит следующим образом:
do { <script block> } while (<condition>)
Таким образом, если мы используем тот же пример, что и ранее, код будет выглядеть так:
$var = 1 do { Write-Host The value of Var is: $var $var++ } while ($var -le 5) Write-Host End of Do-While loop.

Давайте выполним цикл Do-While с значением переменной var = 6. Здесь цикл все равно будет выполнен один раз, прежде чем проверить, что условие было false.
$var = 6 do { Write-Host The value of Var is: $var $var++ } while ($var -le 5) Write-Host End of Do-While loop.

Снова можно использовать логические операторы. Если мы используем такой же пример, как и раньше, вы увидите, что цикл останавливается, когда значение переменной равно 3, потому что мы хотели, чтобы наша переменная была меньше 5 и не равна 3:
Узнайте, какие чувствительные данные хранятся где, оцените связанные с этим риски и внедрите меры защиты данных на основе политики с помощью DataSecurity Plus, программного обеспечения по защите данных от ManageEngine. Начните сегодня с полностью функциональной бесплатной пробной версии на 30 дней.
$var = 1 do { Write-Host The value of Var is: $var $var++ } while ($var -le 5 -and $var -ne 3) Write-Host End of Do-While loop.

Цикл Do-Until в PowerShell
Цикл Do-Until работает так же, как и цикл Do-While: он выполняет блок скрипта сначала, а затем оценивает условие. Разница заключается в том, что в то время как цикл Do-While входит в цикл с условием true, цикл Do-Until ищет условие false, чтобы войти в цикл.

Синтаксис цикла Do-Until следующий:
do { <script block> } until (<condition>)
Как видите, структура выглядит почти идентично циклу Do-While. Однако давайте посмотрим, каким будет результат, если мы продолжим использовать наш предыдущий пример:
$var = 1 do { Write-Host The value of Var is: $var $var++ } until ($var -le 5) Write-Host End of Do-Until loop.

Поскольку условный тест оценивается как true, цикл Do-Until не запускается, потому что нам нужен результат false, чтобы войти в цикл. В этом случае, если вы хотели бы повторить цикл 5 раз, логический оператор должен быть изменен на больше чем (-gt), что даст ложный результат для первых 5 итераций:
$var = 1 do { Write-Host The value of Var is: $var $var++ } until ($var -gt 5) Write-Host End of Do-Until loop.

Снова, поскольку нам нужно, чтобы начальное условие было false, чтобы войти и остаться в цикле, это также повлияет на логические операторы, если нам нужно определить более сложное выражение.
В следующем примере мы должны использовать оператор -или, чтобы цикл повторялся, пока наша переменная не превысит 5 (требуемый ложный результат) или не станет равной 3. Мы не могли бы использовать оператор -и, который потребовал бы, чтобы переменная была больше 5 и одновременно равнялась 3, потому что это привело бы к бесконечному циклу.
$var = 1 do { Write-Host The value of Var is: $var $var++ } until ($var -gt 5 -or $var -eq 3) Write-Host End of Do-Until loop.

Как управлять циклами в PowerShell
Вы можете контролировать выполнение цикла, используя ключевые слова для выхода из цикла без вычисления условия или для пропуска текущей итерации цикла. Хотя эти ключевые слова иногда могут быть полезны, их всегда не рекомендуется использовать, так как они могут усложнить чтение скрипта.
Оператор break
Оператор break немедленно останавливает и выходит из текущего цикла, без выполнения оставшейся части кода в блоке скрипта цикла и без вычисления указанного условия. Это позволяет PowerShell продолжить выполнение оставшейся части кода.
Ключевое слово break ведет себя одинаково независимо от типа используемого цикла. Используя один из примеров выше, мы будем считать от 1 до 5 и выйдем из цикла, если счетная переменная равна трем. Но на этот раз мы добавим break вместо использования логических операторов в условии проверки.
Определите, какие чувствительные данные хранятся где, оцените риски, связанные с ними, и внедрите меры защиты данных на основе политики с помощью DataSecurity Plus, программного обеспечения по защите данных от ManageEngine. Начните сегодня с полностью функциональной бесплатной пробной версии на 30 дней.
Для достижения этой цели будет использован оператор if для определения критериев выхода.
For ($var = 1; $var -le 5; $var++) { if ($var -eq 3) {break} Write-Host The value of Var is: $var } Write-Host End of for loop.

Когда значение счетной переменной равно 3, срабатывает оператор if, и выполняется ключевое слово break. Поскольку ключевое слово break размещено перед командой Write-Host в блоке сценария, последнее не будет обработано. Цикл завершается, и сценарий продолжает выполнять оставшийся код.
Оператор continue
Оператор continue позволяет пропустить оставшуюся часть кода и вернуться в начало цикла без его завершения.
Как и в предыдущем примере, будет использоваться цикл For, но на этот раз, вместо того, чтобы выйти из цикла, когда переменная счетчика достигает значения 3, PowerShell пропустит оставшуюся часть кода для текущей итерации и продолжит цикл до тех пор, пока условие проверки станет ложью.
for ($var = 1; $var -le 5; $var++) { if ($var -eq 3) {Continue} Write-Host The value of Var is: $var } Write-Host End of for loop.

Как вы, скорее всего, заметили, когда значение переменной равно 3, вызывается if-предложение, выполняется оператор continue. Затем он пропускает остальную часть кода внутри цикла, не разрывая его.
Заключение
PowerShell поддерживает различные типы циклов, и очень важно понимать, как они могут помочь вам упростить ваши скрипты и повторить определенные действия в последовательном порядке. Мы большое внимание уделяли PowerShell-tricks на Petri, поэтому обязательно прочитайте наши другие руководства о том, как писать PowerShell скрипты и как использовать параллельный вариант ForEach.
Связанная статья:
Source:
https://petri.com/how-to-use-powershell-for-while-loops/