W tym tutorialu PowerShell pokażemy jak używać pętli For, pętli ForEach-Object oraz pętli While, Do-While i Do-Until.
Pętle PowerShell, w swojej najbardziej podstawowej formie, po prostu powtarzają ten sam zestaw poleceń określoną liczbę razy. Idealne do wykonywania spójnych akcji przez określony czas lub określoną liczbę rekordów, pętle mogą uprościć twoje skrypty w znaczny sposób. PowerShell w szczególności posiada wiele cmdletów — zwłaszcza te, które zaczynają się od czasownika Get — które zwracają obiekty zawierające dużą liczbę podobnych danych.
W PowerShell dostępnych jest kilka typów pętli, a w wielu przypadkach więcej niż jedna technika pętli może być efektywnie wykorzystana. Czasami wymagane jest określenie najbardziej efektywnego typu pętli, zarówno z punktu widzenia wydajności, jak i czytelności kodu.
Pętla ForEach-Object
W wielu przypadkach użycie cmdletu ForEach-Object (omówionego wcześniej w naszym artykule na temat pracy z obiektami w PowerShellu) jest najlepszym sposobem na zapętlenie obiektu. W najprostszym przypadku ForEach-Object wymaga jedynie obiektu, który ma być zapętlony oraz bloku skryptu zawierającego polecenia, które mają być wykonane na każdym członie obiektu.
Parametry te mogą być określone albo przez nazwy parametrów -InputObject i -Process, albo przez przesłanie obiektu do cmdletu ForEach-Object i umieszczenie bloku skryptu jako pierwszego parametru. Aby zilustrować tę podstawową składnię, poniższy przykład pokazuje dwie metody użycia ForEach-Object do zapętlenia zawartości folderu Documents użytkownika:
$myDocuments = Get-ChildItem $env:USERPROFILEDocuments -File
$myDocuments | ForEach-Object {$_.FullName}
ForEach-Object -InputObject $myDocuments -Process {$_.FullName}
W niektórych scenariuszach korzystne może być wykonanie jednej lub więcej akcji tuż przed lub tuż po wykonaniu pętli. Parametry -Begin i -End mogą być użyte do zdefiniowania bloków skryptów do wykonania tuż przed lub po zawartości bloku skryptowego -Process. Może to być wykorzystane do ustawienia lub modyfikacji zmiennej przed lub po wykonaniu pętli.
ForEach-Object ma dwa aliasy, ForEach i %, a także obsługuje składnię skróconą, począwszy od PowerShell 3.0. Poniższe trzy przykłady mają identyczne funkcje.
Get-WMIObject Win32_LogicalDisk | ForEach-Object {$_.FreeSpace}
Get-WMIObject Win32_LogicalDisk | ForEach {$_.FreeSpace}
Get-WMIObject Win32_LogicalDisk | % FreeSpace
Pętla PowerShell For
Pętle For są zwykle używane do iteracji przez zestaw poleceń określoną liczbę razy, albo do przejścia przez tablicę lub obiekt, albo po prostu do powtórzenia tego samego bloku kodu w razie potrzeby. Pętla For jest konstruowana przez ustawienie wartości zmiennej przy wejściu do pętli, warunku, przy którym pętla powinna zostać zakończona, oraz akcji, która ma być wykonywana względem tej zmiennej przy każdym przejściu przez pętlę.
Poniższy przykład pokazuje podstawową pętlę For użytą do utworzenia tabliczki mnożenia:
For ($i=0; $i -le 10; $i++) {
„10 * $i = ” + (10 * $i)
}
Pętle for można wykorzystać do krokowego przechodzenia przez wartości tablicowe, ustawiając wartość początkową na początkowy indeks tablicy i przyrostowo zwiększając wartość, aż do osiągnięcia długości tablicy. Indeks tablicy jest określony przez umieszczenie inkrementowanej zmiennej wewnątrz nawiasów kwadratowych bezpośrednio po nazwie zmiennej, jak pokazano w następującym przykładzie:
$colors = @(„Red”, „Orange”, „Yellow”, „Green”, „Blue”, „Indigo”, „Violet”)
For ($i=0; $i -lt $colors.Length; $i++) {
$colors
}
Pętle While, Do-While i Do-Until
Trzeci typ pętli obsługiwany przez PowerShell polega na ustawieniu warunku, który pozwala pętli działać tak długo, jak warunek jest prawdziwy lub dopóki nie zostanie spełniony. Pętle While i Do-While służą do wykonywania akcji w czasie, gdy warunek ma wartość $true, a różnią się jedynie składnią. Pętle Do-Until mają podobną składnię do Do-While, ale zatrzymują przetwarzanie, gdy warunek jest spełniony.
Pętle Do-While i Do-Until zaczynają się od słowa kluczowego Do poprzedzającego blok skryptu, po którym następuje słowo kluczowe warunku (While lub Until) i warunek. Jako przykład, poniższe dwie pętle działają identycznie, tylko warunek jest odwrócony:
$i=1
Do {
$i
$i++
}
While ($i -le 10)$i=1
Do {
$i++
}
Until ($i -.gt 10)
Pętle While wykonują się identycznie jak pętle Do-While, tylko składnia jest nieco zmieniona. Pętle While używają tylko słowa kluczowego While, po którym następuje warunek, a na końcu blok skryptu. Ta pętla ma identyczną funkcję jak poprzednie przykłady i używa tego samego warunku co pętla Do-While:
$i=1
While ($i -le 10)
{
$i
$i++
}
Każdy z tych trzech typów pętli — pętle Do-While, Do-Until i While — może być również użyty do zapętlania w nieskończoność; Pętle While i Do-While z warunkiem ustawionym na $true, a Do-Until z warunkiem ustawionym na $false.
W niektórych sytuacjach może zajść potrzeba wcześniejszego wyjścia z pętli na podstawie czegoś innego niż warunek pętli. W takim przypadku można wywołać słowo kluczowe Break, aby wyjść z pętli. Ten ostatni przykład pokazuje tę samą funkcjonalność, ale używa nieskończonej pętli i słowa kluczowego Break, aby wyjść z pętli w odpowiednim momencie:
$i=1
While ($true)
{
$i
$i++
if ($i -gt 10) {
Break
}
}