Поиск по сайту:

Объяснение цикла Do While в PowerShell


Циклы являются одной из основных функций в любом языке программирования или скриптирования. Один из таких циклов - это цикл Do While, который выполняет фрагмент кода, пока условие истинно.

В PowerShell мы можем использовать цикл While и цикл Do-While. Они могут выглядеть одинаково, но между ними есть разница, которую важно понять.

В этой статье я объясню разницу между двумя циклами и покажу, как использовать цикл Do-While в вашем скрипте.

Цикл Do While в PowerShell

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

Теперь в PowerShell у нас есть три разных типа циклов, которые мы можем использовать:

  • Цикл while
  • Цикл Do While
  • Цикл «До тех пор пока»

Цикл While выполнит код внутри цикла только в том случае, если условие истинно. Однако циклы Do While и Do Until выполнят код в цикле как минимум один раз. Это важное отличие, о котором следует помнить.

Разница между Do-While и Do-Until заключается в том, что первый будет выполнять код в цикле, пока условие истинно. В то время как Do-Until мы выполняем код, пока условие ложно.

Также хорошо знать, что PowerShell не продолжит выполнение вашего скрипта, пока цикл не будет завершен.

Использование цикла Do-While

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

Давайте рассмотрим простой пример. Код ниже будет записывать текущее число ($i) и увеличивать его на 1, пока $i меньше 5:

$i = 0
do {
    # code to execute
    Write-Host "The number is $i"
    $i++
} while ($i -le 5)

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

Продолжить и прервать

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

С другой стороны, оператор continue прекратит обработку текущего элемента в цикле и перейдет к следующей итерации. Оператор continue повторно оценит условие цикла while. Поэтому, если условие выполнено перед оператором continue, то цикл Do-While завершится.

Давайте посмотрим на пример с Continue внутри цикла. Код ниже получит все файлы из указанного каталога. Если мы найдем скрытый файл, будет вызван оператор Continue, который перейдет к следующему:

$files = Get-ChildItem "C:\Temp"
$i = 0

Do {
    $file = $files[$i]
    
    if ($file.Attributes -match "Hidden") {
        $i++
        continue  # Skip hidden files
    }

    Write-Host "Processing file: $file.Name"
    $i++
} While ($i -lt $files.Count)

Оператор Break, например, можно использовать для проверки, хотим ли мы продолжать цикл. В примере ниже будет предложено пользователю ответить, хочет ли он продолжить, и если ответ будет 'нет', мы выйдем из цикла:

Do {
    $response = Read-Host "Do you want to continue? (yes/no)"
    
    if ($response -eq "no") {
        Write-Host "Exiting loop."
        break  # Exit the loop if the user chooses "no"
    }
    
    Write-Host "Continuing..."
    
} While ($response -ne "no")

Write-Host "Loop ended."

Примеры цикла do-while

Лично мне легче учить программирование или скриптинг на примерах. Поэтому я создал пару реалистичных примеров с циклом Do-While, чтобы помочь вам начать.

Первое, на что мы собираемся взглянуть, это небольшой скрипт, который будет ждать, пока запущена указанная служба. В этом примере мы будем ждать, пока запустится служба обновления Windows. Имейте в виду, что PowerShell не выполнит код ниже цикла Do While, пока условие While не будет выполнено:

$serviceName = "wuauserv"  # Windows Update service
$serviceStatus = (Get-Service -Name $serviceName).Status

Do {
    Write-Host "Waiting for the service '$serviceName' to start..."
    Start-Sleep -Seconds 5
    $serviceStatus = (Get-Service -Name $serviceName).Status
} While ($serviceStatus -ne "Running")

Write-Host "The service '$serviceName' is now running."

В приведенном выше примере вам нужно начать с оператора If-Else, проверяя, работает ли служба вообще или нет. Если служба не запущена, вы можете ее запустить, а затем использовать приведенный выше код, чтобы дождаться, пока она не запустится.

Проверка пользовательского ввода

Еще один распространенный случай использования - это когда вам необходимо проверить ввод пользователя в вашем скрипте. Мы можем использовать цикл Do-While, чтобы продолжать запрашивать новый ввод, пока он не соответствует нашему определенному условию. Например, мы запрашиваем адрес электронной почты и проверяем, соответствует ли он шаблону адреса электронной почты, прежде чем продолжить:

$emailPattern = "^[\w\.-]+@[\w\.-]+\.\w+$"
$email = ""

Do {
    $email = Read-Host "Enter a valid email address"
} While ($email -notmatch $emailPattern)

Write-Host "Valid email entered: $email"

В условии While мы не ограничены одной условией. Мы можем иметь несколько условий и комбинировать их с помощью операторов -And или -Or. Например, мы можем установить максимум по количеству попыток, которые пользователь может сделать:

$maxAttempts = 3
$attempts = 0
do {
    $input = Read-Host "Enter a number between 1 and 10"
    $attempts++
} while (($input -lt 1 -or $input -gt 10) -and ($attempts -ne $maxAttempts))

Бесконечный цикл

Если вы установите условие в значение true, то вы сможете создать бесконечный цикл в PowerShell. Код внутри цикла будет выполняться до тех пор, пока $condition внутри цикла является истинным. Затем мы можем использовать оператор Break, чтобы выйти из цикла.

Do {
    # Do stuff forever
    Write-Host 'looping'

    # Use Break to exit the loop
    If ($condition) {
        Break
    }
} While ($true)

Попытка загрузить файл

Циклы do-while также являются отличным вариантом, когда вы хотите что-то попробовать. В приведенном ниже примере мы попробуем скачать файл. Используя блок Try-Catch, мы можем проверить, был ли успешным попытка скачивания или нет.

Мы будем продолжать пытаться скачать файл, пока это не удастся или пока не будет достигнуто максимальное количество попыток.

$url = "https://example.com/file.zip"
$destination = "C:\Downloads\file.zip"
$attempt = 0
$maxAttempts = 5

Do {
    $attempt++
    Write-Host "Attempt $attempt: Downloading file..."
    try {
        Invoke-WebRequest -Uri $url -OutFile $destination
        $success = $true
    } catch {
        Write-Host "Download failed, retrying..."
        Start-Sleep -Seconds 5
        $success = $false
    }
} While (-not $success -and $attempt -lt $maxAttempts)

if ($success) {
    Write-Host "File downloaded successfully!"
} else {
    Write-Host "Failed to download file after $maxAttempts attempts."
}

Заключение

Циклы Do-While — это отличное выражение управления потоком, которое можно использовать в PowerShell. Имейте в виду, что код внутри цикла Do всегда выполняется хотя бы один раз. Если вы хотите выполнять код только когда условие выполнено, вам нужно использовать обычный цикл While.

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