Как использовать цикл For, While и другие циклы в PowerShell

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

Цикл For в PowerShell

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

PowerShell For Loop

Синтаксис цикла For следующий:

for (<Init>; <Condition>; <Repeat>) {

<Script Block>

}
  • Блок <Init> выполняет команду или набор команд перед началом цикла. Обычно это место, где вы инициализируете переменную счетчика.
  • В разделе <Condition> вы оцениваете условное тестирование. Если оно true, вы входите в цикл и выполняете команды в блоке скрипта. Затем условие оценивается снова до тех пор, пока не станет false.
  • Заменитель <Repeat> выполняет одну или несколько команд, разделенных запятыми на каждой итерации цикла. Обычно он используется для изменения переменной счетчика.

Если вы хотите повторить определенную операцию пять раз, воспользуйтесь следующим примером:

Защита данных

Узнайте, какие конфиденциальные данные хранятся где, оцените риски, связанные с ними, и внедрите меры по защите данных на основе политики с DataSecurity Plus, программным обеспечением по защите данных от ManageEngine. Начните сегодня с полностью функциональной бесплатной пробной версии на 30 дней.

Learn More

for ($var = 1; $var -le 5; $var++) {

Write-Host The value of Var is: $var

}

Write-Host End of for loop.
A PowerShell loop repeating the same operation five times

Здесь переменная инициализируется значением 1, которое меньше 5, поэтому вы входите в цикл и выполняете блок скрипта. На каждой итерации значение переменной увеличивается на 1 и оценивается по условию, пока результат не станет ложным.

Так как условие оценивается в начале, если результат ложный, блок команд не будет выполнен:

for ($var = 6; $var -le 5; $var++) {

Write-Host The value of Var is: $var

}

Write-Host End of for loop.
If the initial condition if false, the loop won’t be executed

При необходимости вы можете использовать логические операторы для указания дополнительных условий. В данном случае мы добавили несколько условий. И потому что логический оператор возвращает значение истина только тогда, когда оба условия истинны, цикл завершается, когда выражение $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.
We added another condition to stop the script when the variable reaches a false state.

Как упоминалось ранее, вы можете выполнять одну или несколько команд в заполнителях <Инициализация> и <Повторение>. В приведенном ниже примере у нас есть переменная $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.
Two different variables are being updated 

Как определить условия цикла в 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 дней.

Learn More

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
We ran a PowerShell ForEach loop with a collection of five items.

Переменная инициализируется первым значением из коллекции, которое равно 1, затем выполняется блок сценария. На следующей итерации переменной присваивается следующий элемент в массиве, который равен 2. Блок сценария обрабатывается снова и снова, пока все элементы в коллекции не будут обработаны.

Например, если вы хотите обработать первые пять служб, работающих на вашем компьютере, ваш цикл будет выглядеть так:

foreach ($service in (Get-Service | Select-Object -First 5)) {

Write-Host Service name is: $service.name and status is $service.status

}
This script shows the first five services working on our computer

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

Цикл While в PowerShell

Оператор While в PowerShell используется для создания цикла, который выполняет команду или набор команд, если условие оценивается как true. Он проверяет условие перед выполнением блока скрипта. Пока условие true, PowerShell выполняет блок скрипта до тех пор, пока условие не станет false.

Diagram showing how a PowerShell While loop works

Синтаксис цикла while выглядит следующим образом:

while (<Condition>){<Script Block>}

Например, если у вас есть переменная с именем var с начальным значением 1, и вы хотите повторить цикл пять раз, цикл должен иметь следующую структуру:

Защита данных

Знайте, какие конфиденциальные данные хранятся где, оцените риски, связанные с ними, и внедрите меры защиты данных на основе политики с помощью DataSecurity Plus, программного обеспечения по защите данных от ManageEngine. Начните сегодня с полностью функциональной бесплатной пробной версии на 30 дней.

Learn More

$var = 1

while ($var -le 5)

{

Write-Host The value of Var is: $var

$var++

}

Write-Host End of While loop.
Example of a loop running five times

В приведенном выше примере переменная инициализируется за пределами цикла и инкрементируется в блоке скрипта. Команда 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.
The result of the loop if the initial condition is false

Можно использовать более сложные условия с помощью логических операторов. Например, если вы хотите, чтобы переменная была меньше 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.
Running the loop with a variable we want to be less than 5 and not equal to 3

Как упоминалось ранее, при использовании логического оператора -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.

Diagram showing how a PowerShell Do-While loop works

Синтаксис цикла 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.
Running a 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.
The script was still executed even though the initial condition was false.

Снова можно использовать логические операторы. Если мы используем такой же пример, как и раньше, вы увидите, что цикл останавливается, когда значение переменной равно 3, потому что мы хотели, чтобы наша переменная была меньше 5 и не равна 3:

Защита данных

Узнайте, какие чувствительные данные хранятся где, оцените связанные с этим риски и внедрите меры защиты данных на основе политики с помощью DataSecurity Plus, программного обеспечения по защите данных от ManageEngine. Начните сегодня с полностью функциональной бесплатной пробной версии на 30 дней.

Learn More

$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.
The script stops because we wanted our variable to be less than 5 and not equal to 3

Цикл Do-Until в PowerShell

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

Diagram showing how a PowerShell Do-Until loop works

Синтаксис цикла 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.
The Do-Until loop is not triggered as it needs an initial false result

Поскольку условный тест оценивается как 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.
Changing the logical operator to ‘greater than’ provides us a false result for the first iterations of the 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.
We use the -or operator to have the Do-Until loop repeat until our variable is greater than 5 or equal to 3

Как управлять циклами в PowerShell

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

Оператор break

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

Ключевое слово break ведет себя одинаково независимо от типа используемого цикла. Используя один из примеров выше, мы будем считать от 1 до 5 и выйдем из цикла, если счетная переменная равна трем. Но на этот раз мы добавим break вместо использования логических операторов в условии проверки.

Защита данных

Определите, какие чувствительные данные хранятся где, оцените риски, связанные с ними, и внедрите меры защиты данных на основе политики с помощью DataSecurity Plus, программного обеспечения по защите данных от ManageEngine. Начните сегодня с полностью функциональной бесплатной пробной версии на 30 дней.

Learn More

Для достижения этой цели будет использован оператор 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.
We’ve used a break statement instead of using logical operators to stop the script

Когда значение счетной переменной равно 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.
The if statement is triggered when the value of the variable is equal to 3

Как вы, скорее всего, заметили, когда значение переменной равно 3, вызывается if-предложение, выполняется оператор continue. Затем он пропускает остальную часть кода внутри цикла, не разрывая его.

Заключение

PowerShell поддерживает различные типы циклов, и очень важно понимать, как они могут помочь вам упростить ваши скрипты и повторить определенные действия в последовательном порядке. Мы большое внимание уделяли PowerShell-tricks на Petri, поэтому обязательно прочитайте наши другие руководства о том, как писать PowerShell скрипты и как использовать параллельный вариант ForEach.

Связанная статья:

Source:
https://petri.com/how-to-use-powershell-for-while-loops/