Поиск…


Вступление

Цикл представляет собой последовательность команд (инструкций), которые непрерывно повторяются до тех пор, пока не будет достигнуто определенное условие. Возможность многократного выполнения вашей программы блока кода является одной из самых простых, но полезных задач в программировании. Цикл позволяет писать очень простой оператор для получения значительно большего результата просто повторением. Если условие достигнуто, следующая инструкция «проваливается» к следующей последовательной инструкции или ветвям вне цикла.

Синтаксис

  • for (<Инициализация>; <Условие>; <Повторение>) {<Script_Block>}

  • <Коллекция> | Foreach-Object {<Script_Block_with _ $ __ as_current_item>}

  • foreach (<Item> in <Collection>) {<Script_Block>}

  • while (<Условие>) {<Script_Block>}

  • do {<Script_Block>}, а (<Условие>)

  • do {<Script_Block>} до (<Условие>)

  • <Collection> .foreach ({<Script_Block_with _ $ __ as_current_item>})

замечания

Для каждого

Существует несколько способов запуска цикла foreach в PowerShell, и все они приносят свои преимущества и недостатки:

Решение преимущества Недостатки
Предписание Самый быстрый. Лучше всего работает со статическими коллекциями (хранится в переменной). Отсутствие ввода или вывода конвейера
Метод ForEach () Такой же синтаксис скриптового блока, что и Foreach-Object , но быстрее. Лучше всего работает со статическими коллекциями (хранится в переменной). Поддерживает вывод конвейера. Нет поддержки ввода трубопровода. Требуется PowerShell 4.0 или выше
Foreach-Object (командлет) Поддерживает ввод и вывод конвейера. Поддерживает начальные и конечные скрипты для инициализации и закрытия соединений и т. Д. Наиболее гибкое решение. Slowest

Спектакль

$foreach = Measure-Command { foreach ($i in (1..1000000)) { $i * $i } }
$foreachmethod = Measure-Command { (1..1000000).ForEach{ $_ * $_ } }
$foreachobject = Measure-Command { (1..1000000) | ForEach-Object { $_ * $_ } }

"Foreach: $($foreach.TotalSeconds)"
"Foreach method: $($foreachmethod.TotalSeconds)"
"ForEach-Object: $($foreachobject.TotalSeconds)"

Example output:

Foreach: 1.9039875
Foreach method: 4.7559563
ForEach-Object: 10.7543821

В то время как Foreach-Object является самым медленным, поддержка конвейера может быть полезна, поскольку позволяет обрабатывать элементы по мере их поступления (при чтении файла, получении данных и т. Д.). Это может быть очень полезно при работе с большими данными и низкой памятью, так как вам не нужно загружать все данные в память перед обработкой.

За

for($i = 0; $i -le 5; $i++){
    "$i"
}

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

Для каждого

ForEach имеет два разных значения в PowerShell. Одним из них является ключевое слово, а другое - псевдоним для командлета ForEach-Object . Здесь описывается первая.

Этот пример демонстрирует печать всех элементов в массиве на хосте консоли:

$Names = @('Amy', 'Bob', 'Celine', 'David')

ForEach ($Name in $Names)
{
    Write-Host "Hi, my name is $Name!"
}

Этот пример демонстрирует захват вывода цикла ForEach:

$Numbers = ForEach ($Number in 1..20) {
    $Number # Alternatively, Write-Output $Number
}

Как и в последнем примере, вместо этого этот пример демонстрирует создание массива до хранения цикла:

$Numbers = @()
ForEach ($Number in 1..20)
{
    $Numbers += $Number
}

В то время как

Цикл while будет оценивать условие, и если true выполнит действие. Пока условие оценивается как true, действие будет продолжаться.

while(condition){
  code_block
}

В следующем примере создается цикл, который будет отсчитывать от 10 до 0

$i = 10
while($i -ge 0){
    $i
    $i--
}

В отличие от цикла Do -While условие оценивается до первого выполнения действия. Действие не будет выполнено, если начальное условие будет равно false.

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

Start-Process notepad.exe
while(Get-Process notepad -ErrorAction SilentlyContinue){
  Start-Sleep -Milliseconds 500
}

ForEach-Object

Командлет ForEach-Object работает аналогично инструкции foreach , но берет свой вход из конвейера.

Основное использование

$object | ForEach-Object {
    code_block
}

Пример:

$names = @("Any","Bob","Celine","David")
$names | ForEach-Object {
    "Hi, my name is $_!"
}

Foreach-Object имеет два псевдонима по умолчанию, foreach и % (сокращенный синтаксис). Наиболее распространенным является % потому что foreach можно путать с оператором foreach . Примеры:

$names | % {  
    "Hi, my name is $_!"
} 

$names | foreach {  
    "Hi, my name is $_!"
} 

Расширенное использование

Foreach-Object выделяется из альтернативных решений foreach потому что это командлет, что означает, что он предназначен для использования конвейера. Из-за этого он поддерживает три скриптовых блока, как командлет или расширенную функцию:

  • Начать : Выполняется один раз, прежде чем перебирать элементы, которые поступают из конвейера. Обычно используется для создания функций для использования в цикле, создания переменных, открытия соединений (база данных, веб +) и т. Д.
  • Процесс : Выполняется один раз за элемент, полученный из конвейера. «Нормальный» кодовый блок foreach. Это значение по умолчанию используется в приведенных выше примерах, когда параметр не указан.
  • Конец : Выполняется один раз после обработки всех элементов. Обычно используется для закрытия соединений, создания отчета и т. Д.

Пример:

"Any","Bob","Celine","David" | ForEach-Object -Begin {
    $results = @()
} -Process {
    #Create and store message
    $results += "Hi, my name is $_!"
} -End {
    #Count messages and output
    Write-Host "Total messages: $($results.Count)"
    $results
}

Делать

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

Вы можете использовать do-loops двумя способами:

  • Петля, пока условие верно:

    Do {
        code_block
    } while (condition)
    
  • Loop до тех пор, пока условие не будет истинным, другими словами, цикл, пока условие ложно:

    Do {
        code_block
    } until (condition)
    

Реальные примеры:

$i = 0

Do {
    $i++
    "Number $i"
} while ($i -ne 3)

Do {
    $i++
    "Number $i"
} until ($i -eq 3)

Do-While и Do-Until - антонимы. Если код внутри одного и того же, условие будет отменено. Приведенный выше пример иллюстрирует это поведение.

Метод ForEach ()

4,0

Вместо командлета ForEach-Object здесь также есть возможность использовать метод ForEach непосредственно на объектных массивах, например, так

(1..10).ForEach({$_ * $_})

или - при желании - круглые скобки вокруг блока сценария могут быть опущены

(1..10).ForEach{$_ * $_}  

Оба результата приведут к выходу ниже

1
4
9
16
25
36
49
64
81
100  

Продолжить

Continue оператор работает в For , ForEach , While и Do петлю. Он пропускает текущую итерацию цикла, прыгая на вершину самого внутреннего цикла.

$i =0
while ($i -lt 20) {
    $i++ 
    if ($i -eq 7) { continue }
    Write-Host $I
}

Вышеуказанное будет выводить от 1 до 20 на консоль, но пропустите номер 7.

Примечание . При использовании контура конвейера вы должны использовать return вместо Continue .

Перерыв

Оператор break немедленно выйдет из цикла программы. Его можно использовать в циклах For , ForEach , While и Do или в Switch .

$i = 0
while ($i -lt 15) {
    $i++ 
    if ($i -eq 7) {break}
    Write-Host $i
}

Вышеуказанное будет считаться до 15, но остановится, как только будет достигнуто 7.

Примечание . При использовании контура конвейера break будет вести себя как continue . Чтобы смоделировать break в конвейере контура, вам нужно включить дополнительную логику, командлет и т. Д. Легче придерживаться конвейерных конвейеров, если вам нужно использовать break .

Перерыв этикетки

Break также может вызывать метку, помещенную перед созданием цикла:

$i = 0
:mainLoop While ($i -lt 15) {
    Write-Host $i -ForegroundColor 'Cyan'
    $j = 0
    While ($j -lt 15) {
        Write-Host $j -ForegroundColor 'Magenta'
        $k = $i*$j
        Write-Host $k -ForegroundColor 'Green'
        if ($k -gt 100) {
            break mainLoop
        }
        $j++
    }
    $i++
}

Примечание. Этот код будет увеличивать $i до 8 и $j до 13 что приведет к тому, что значение $k равно 104 . Поскольку $k превышает 100 , код будет выходить из обоих циклов.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow