Цикл While в PowerShell: Руководство по основам

PowerShell – это мощный скриптовый язык, который предоставляет множество функций для автоматизации и управления системами на базе Windows. Одной из наиболее часто используемых конструкций является цикл while в PowerShell.

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

Читайте далее, чтобы развить свои навыки написания сценариев на PowerShell!

Требования

Это руководство будет демонстрацией на практике. Чтобы идти в ногу со временем, убедитесь, что у вас есть следующее:

  • A Windows machine – This tutorial uses Windows 10.
  • Установлен Windows PowerShell версии 5.0 или выше – в этом руководстве используется PowerShell 7.
  • A user account with administrator privileges.

Выполнение одноусловных циклов while

Один из самых простых типов циклов while – это одноусловный тип. В отличие от оператора If, этот тип цикла выполняет заданный набор команд до тех пор, пока указанное условие оценивается как true. Когда возвращается значение “False”, цикл прерывается, и выполнение продолжается с остальной частью скрипта.

Ниже приведен синтаксис для одиночного цикла while:

  • Первое, что вы заметите, – это использование круглых скобок. Условие должно быть заключено в круглые скобки, в то время как блок кода представляет собой набор команд PowerShell, которые выполняются, пока условие истинно.
  • Второе, что следует отметить, – условие должно возвращать логическое значение, которое оценивается как True или False.
while (condition)
{

	# Блок кода для выполнения

}

Запустите код ниже, где значение $val начинается с 0 и увеличивается на 1 при каждом выполнении блока кода до тех пор, пока значение переменной $val не станет равным 3.

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

# Объявляет переменную $val с начальным значением 0
$val = 0

# Устанавливает выполнение цикла while до тех пор, пока значение переменной $val не достигнет 3
while($val -ne 3)
{
	# Увеличивает значение переменной $val на 1
	$val++
	
	# Выводит текущее значение переменной $val
	Write-Host $val
}
Understanding Single Condition While Loops.

Выполнение цикла While в PowerShell с использованием встроенных переменных ($true/$false)

Предыдущий пример с использованием условий в цикле while работает хорошо. Но вы также можете использовать встроенные переменные PowerShell, такие как $true и $false, чтобы создать цикл While.

Нижеприведенный синтаксис выполняется до тех пор, пока $true больше не является $true. Другими словами, цикл работает бесконечно. Но всегда следует предусмотреть способ выхода из бесконечного цикла. В противном случае вы навсегда застрянете. Больше вы узнаете о том, как выйти из цикла, используя break и continue, позже в этом руководстве.

while($true)
{

	# Блок кода для выполнения

}

Выполните ниже приведенный блок кода, который выполняется бесконечно, печатая значение $i в консоль.

# Объявляет переменную $i с начальным значением 0
$i = 0

# Устанавливает цикл While на выполнение, пока условие $true
while($true)
{
	# Увеличивает значение $i на 1
	$i++
	
	# Печатает текущее значение переменной $i
	Write-Host $i
}

Теперь нажмите Ctrl+C, чтобы выйти из цикла. Этот цикл потребляет много системных ресурсов, поэтому будьте осторожны при их использовании.

Executing a while loop with PowerShell’s built-in ($true) variable

Выполнение многокондиционных циклов While

Кроме однократных условных циклов while, вы также можете создавать многократные условные циклы while. Как и в случае с однократным условным циклом While, условия должны возвращать логическое значение, либо True, либо False.

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

  • И () – Оба условия должны быть истинными.
  • ИЛИ (-или) (Любое из условий может быть истинным).
# Оператор И
while (condition1 -AND condition2)
{

	# Блок кода для выполнения

}

# Оператор ИЛИ
while (condition1 -OR condition2)
{

	# Блок кода для выполнения

}

Выполните код ниже, который выполняет цикл while, пока $val не равен (-ne) 3 $i не равно (-ne) 5.

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

# Объявляет переменные $val и $i с начальными значениями 0
$val = 0
$i = 0

# Устанавливает выполнение цикла While до тех пор, пока $val не будет равно 3 и $i не будет равно 5
while($val -ne 3 -and $i -ne 6)
{
	# Увеличивает $val на 1
  $val++
	# Увеличивает $i на 2
  $i += 2
	# Выводит текущие значения переменных $val и $i
  Write-Host "$val, $i"
}

Выполнение цикла while с оператором AND

Executing a while loop with AND operator

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

Если пользователь вводит число, меньшее (-lt) 1, или не является числом (-nomatch), пользователю снова предлагается ввести допустимое число. Это поведение полезно, чтобы предоставить пользователям несколько шансов ввести допустимый ввод.

# Запрашивает у пользователей ввод их возраста
$age = Read-Host "Please Enter Your Age"

# Устанавливает выполнение цикла While до тех пор, пока пользователь не введет допустимый ввод
while($age -notmatch "\\d+" -or $age -lt 1)
{
	# Повторно предлагает пользователю ввести допустимый возраст
  $age = Read-Host "Please Enter Your Valid Age"
}
# Выводит допустимый ввод возраста
Write-Host "Your age is $age

В выводе ниже вы можете видеть, что пользователю было предложено ввести свой возраст три раза, следующим образом:

  • Первый раз пользователь ввел десять, что не является числом.
  • Во второй раз пользователь ввел 0, что меньше 1.
  • В третий раз пользователь ввел 10, что является допустимым возрастом.
Executing a while loop with the OR operator

Использование ключевых слов BREAK и CONTINUE в циклах While

Вы видели, как циклы while добавляют гибкость к вашему сценарию PowerShell. Но для лучшего контроля за выполнением ваших циклов While добавьте ключевые слова break и continue.

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

Эти ключевые слова работают следующим образом:

Keyword Function
break Immediately exits the loop and continues execution with the rest of the script.
continue Skips over the remaining code block in the current iteration of the loop and continues with the next iteration.

Выполните приведенный ниже код, который выполняет цикл по массиву из 10 элементов.

В приведенном ниже коде оператор if проверяет значение $i. Если значение $i равно 5, ключевое слово continue пропускает оставшийся код в цикле и продолжает следующую итерацию. Если значение $i равно 8, ключевое слово break завершает цикл и продолжает выполнение остальной части сценария.

В противном случае цикл while выводит (Write-Host) и увеличивает значение переменной $i на 1.

# Объявляет массив из 10 элементов
$array = 1..10
# Объявляет переменную $i с начальным значением 0
$i = 0
# Устанавливает выполнение цикла While до выполнения условия
while($i -lt $array.Count)
{
	# Проверяет, равно ли $i 5
  if($i -eq 5)
  {
		# Если да, увеличивает $i на 1
    $i++
		# Продолжает следующую итерацию
    continue
  }
	# Проверяет, равно ли $i 8
  if($i -eq 8)
  {
		# Если да, прерывает выполнение цикла While и продолжает выполнение остального скрипта
    break
  }
	# Печатает текущее значение $i
  Write-Host "Processing item $i"
	# Увеличивает $1 на 1
  $i++
}

Как видно из вывода ниже, цикл пропустил пятый и восьмой элементы массива. Цикл while обработал все остальные элементы массива и завершился после достижения восьмого элемента.

Executing a while loop with break and continue keywords

Ограничение Времени Выполнения Цикла While

Обычно вы можете захотеть ограничить время выполнения цикла. Возможно, вы пытаетесь подключиться к удаленному серверу. Если это так, вы можете дать серверу время для ответа перед завершением цикла с помощью командлета Start-Sleep внутри вашего цикла while.

Команда Start-Sleep приостанавливает выполнение сценария на указанное время.

Выполните приведенный ниже код, чтобы получить и сохранить текущую дату и время Get-Date в переменной $startTime. Цикл while выполняется, пока текущая дата/время меньше, чем 10 секунд от значения, сохраненного в переменной $startTime.

Пока выполняется цикл while, выводится сообщение, а команда Start-Sleep приостанавливает выполнение сценария на 1 секунду.

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

# Получить и сохранить текущую дату/время
$startTime = Get-Date
# Устанавливает выполнение цикла While, пока текущая дата/время меньше 10 секунд 
	# от значения, сохраненного в $startTime.
while((Get-Date) -lt ($startTime.AddSeconds(10)))
{
	# Выводит сообщение
  Write-Host "Waiting for server to respond..."
	# Приостанавливает выполнение сценария на одну секунду
  Start-Sleep -Seconds 1
}

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

Limiting the time a while loop runs

Вывод

Циклы while в PowerShell пригождаются при работе с комплексными концепциями, чтобы избежать застревания в цикле или при написании ваших сценариев. И в этом уроке вы узнали множество способов работы с циклами while для более гибких и мощных сценариев.

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

Source:
https://adamtheautomator.com/powershell-while-loop/