Skip to content
Vector BCO edited this page Jun 7, 2020 · 11 revisions

К списку тем

Циклы

wiki Цикл - многократно исполняемая последовательность инструкций

+ Удобная конструкция перебора объектов или свойств по одному за итерацию
+ Удобная конструкция повторения блоков кода, функций итд.

- Ресурсоемкая функциональность
- Простота допустить ошибку с вложенностью и количеством элементов что может привести к ухудшению производительности
- Возможность создать вечную петлю ("зависание" скрипта)

В PowerShell get-help about_Do get-help about_For get-help about_While get-help about_Foreach

**Foreach -Parrallel в PowerShell 5 (Workflows)**

Get-Help about_Foreach-Parrallel Foreach-Parrallel для PowerShell < 7 версии Bonus

**Foreach -Parrallel в PowerShell 7**

Foreach-Object -Parallel

get-help about_Break get-help about_Continue

Случаи использования разных типов циклов

Do { <Code> } Until ( <Statement> )

Пока <Statement> не будет правдиво <Code> будет выполняться
При любом <Statement>, <Code> выполниться минимум 1 раз.

Пример

$i = 1
Do {
    $i
    $i++
} Until ( $i -ge 5 )

For ( <OnceBeginConfig> ; <Statement> ; <EachIterationCodeBlock> ) { <Code> }

Традиционный механизм позволяющий повторить часть кода несколько раз до тех пор пока <Statement> будет равно $True
Полные аналоги есть во многих языках.

Пример №1 (традиционный)

For ( $i = 1 ; $i -le 5 ; $i++ ) { $i }

Пример №2 (нетрадиционный)

For ($i = $k = 1 ; $i -le 5; write-host "k : $k") { 
    $i
    $i++
    $k = $i
}

While ( <Statement> ) { <Code> }

Если <Statement> равно $True - код будет выполняться
В отличии от Do\Until если <Statement> будет $False код внутри цикла не выполнится ни разу

Пример

$i = 1
While($i -le 5){
    $i
    $i++
}

PowerShell 5 Foreach-Object

Пример №1 Передача объектов через пайп

1..5 | Foreach-Object { $_ }

Пример №2 Аналог примера №1 без пайпа

ForEach-Object -InputObject @(1..5) -Process { $_ }

Пример №3 Перебор элементов в предопределенной (не автоматической) переменной

ForEach($i in @(1..10)) { Test-Connection -Quiet "172.28.110.$i" -Count 1 }

PowerShell 7 Foreach-Object -Parallel

Все утверждения для PowerShell 5 справедливо кроме Workflow который в 7 версии обозначен как Deprecated В свою очередь Foreach-Object -Parallel в PoSh7 работает без дополнительных оберток (из коробки)

Пример

1..10 | ForEach-Object -Parallel { Test-Connection -Quiet "172.28.110.$_" -Count 1 }

Clone this wiki locally