about_Foreach
Krótki opis
Opisuje polecenie języka, którego można użyć do przechodzenia przez wszystkie elementy w kolekcji elementów.
Długi opis
Instrukcja foreach
(znana również jako foreach
pętla) to konstrukcja języka do przechodzenia przez (iterowanie) serii wartości w kolekcji elementów.
Najprostszym i najbardziej typowym typem kolekcji do przechodzenia jest tablica.
foreach
W pętli często uruchamia się co najmniej jedno polecenie względem każdego elementu w tablicy.
Składnia
Poniżej przedstawiono składnię foreach
:
foreach ($<item> in $<collection>){<statement list>}
Część instrukcji ujętej foreach
w nawiasy reprezentuje zmienną i kolekcję do iteracji. Program PowerShell tworzy zmienną $<item>
automatycznie po uruchomieniu foreach
pętli. Przed każdą iterację przez pętlę zmienna jest ustawiana na wartość w kolekcji.
Blok po foreach
instrukcji {<statement list>}
zawiera zestaw poleceń do wykonania względem każdego elementu w kolekcji.
Przykłady
Na przykład pętla foreach
w poniższym przykładzie wyświetla wartości w tablicy $letterArray
.
$letterArray = "a","b","c","d"
foreach ($letter in $letterArray)
{
Write-Host $letter
}
W tym przykładzie tablica $letterArray
jest tworzona i inicjowana przy użyciu wartości ciągów "a"
, , "b"
"c"
i "d"
. Po pierwszym uruchomieniu instrukcji foreach
ustawia zmienną $letter
równą pierwszemu elementowi ($letterArray
"a"
). Następnie używa Write-Host
polecenia cmdlet , aby wyświetlić literę a. Następnym razem przez pętlę $letter
jest ustawiona wartość "b"
, itd. Po wyświetleniu foreach
w pętli litery d program PowerShell zamyka pętlę.
foreach
instrukcje mogą być również używane razem z poleceniami cmdlet, które zwracają kolekcję elementów. W poniższym przykładzie instrukcja Foreach przechodzi przez listę elementów zwracanych przez Get-ChildItem
polecenie cmdlet.
foreach ($file in Get-ChildItem)
{
Write-Host $file
}
Przykład można uściślić, używając if
instrukcji , aby ograniczyć zwracane wyniki. W poniższym przykładzie instrukcja wykonuje tę samą operację pętli co w poprzednim przykładzie foreach
, ale dodaje instrukcję if
, aby ograniczyć wyniki do plików, które są większe niż 100 kilobajtów (KB):
foreach ($file in Get-ChildItem)
{
if ($file.length -gt 100KB)
{
Write-Host $file
}
}
W tym przykładzie pętla foreach
używa właściwości zmiennej $file
do wykonania operacji porównania ($file.length -gt 100KB
). Zmienna $file
zawiera wszystkie właściwości w obiekcie zwracanym przez Get-ChildItem
polecenie cmdlet. W związku z tym można zwrócić więcej niż tylko nazwę pliku.
W następnym przykładzie program PowerShell zwraca długość i czas ostatniego dostępu na liście instrukcji:
foreach ($file in Get-ChildItem)
{
if ($file.length -gt 100KB)
{
Write-Host $file
Write-Host $file.length
Write-Host $file.lastaccesstime
}
}
W tym przykładzie nie masz ograniczenia do uruchamiania pojedynczego polecenia na liście instrukcji.
Można również użyć zmiennej poza pętlą foreach
i zwiększać zmienną wewnątrz pętli. Poniższy przykład zlicza pliki o rozmiarze ponad 100 KB:
$i = 0
foreach ($file in Get-ChildItem) {
if ($file.length -gt 100KB) {
Write-Host $file "file size:" ($file.length / 1024).ToString("F0") KB
$i = $i + 1
}
}
if ($i -ne 0) {
Write-Host
Write-Host $i " file(s) over 100 KB in the current directory."
}
else {
Write-Host "No files greater than 100 KB in the current directory."
}
W poprzednim przykładzie zmienna $i
jest ustawiona na 0
poza pętlą, a zmienna jest zwiększana wewnątrz pętli dla każdego pliku, który jest większy niż 100 KB. Po zakończeniu if
pętli instrukcja oblicza wartość $i
, aby wyświetlić liczbę wszystkich plików powyżej 100 KB. Może też pojawić się komunikat z informacją, że nie znaleziono żadnych plików o rozmiarze ponad 100 KB.
W poprzednim przykładzie pokazano również, jak sformatować wyniki długości pliku:
($file.length / 1024).ToString("F0")
Wartość jest podzielona przez 1024 w celu pokazania wyników w kilobajtach, a nie bajtów, a wynikowa wartość jest następnie sformatowana przy użyciu specyfikatora formatu stałego punktu w celu usunięcia wszystkich wartości dziesiętnych z wyniku. Wartość 0 sprawia, że specyfikator formatu nie pokazuje miejsc dziesiętnych.
W poniższym przykładzie zdefiniowana funkcja analizuje skrypty i moduły skryptów programu PowerShell i zwraca lokalizację funkcji zawartych w programie . W przykładzie pokazano, jak używać MoveNext
metody (która działa podobnie jak skip X
For
w pętli) i Current
właściwości $foreach
zmiennej wewnątrz bloku skryptu foreach. Przykładowa funkcja może znaleźć funkcje w skrycie, nawet jeśli istnieją nietypowo lub niezmiennie rozmieszczone definicje funkcji, które obejmują wiele wierszy.
Aby uzyskać więcej informacji, zobacz Using Enumerators (Używanie modułów wyliczania).
function Get-FunctionPosition {
[CmdletBinding()]
[OutputType('FunctionPosition')]
param(
[Parameter(Position = 0, Mandatory,
ValueFromPipeline, ValueFromPipelineByPropertyName)]
[ValidateNotNullOrEmpty()]
[Alias('PSPath')]
[System.String[]]
$Path
)
process {
try {
$filesToProcess = if ($_ -is [System.IO.FileSystemInfo]) {
$_
} else {
Get-Item -Path $Path
}
$parser = [System.Management.Automation.Language.Parser]
foreach ($item in $filesToProcess) {
if ($item.PSIsContainer -or
$item.Extension -notin @('.ps1', '.psm1')) {
continue
}
$tokens = $errors = $null
$ast = $parser::ParseFile($item.FullName, ([REF]$tokens),
([REF]$errors))
if ($errors) {
$msg = "File '{0}' has {1} parser errors." -f $item.FullName,
$errors.Count
Write-Warning $msg
}
:tokenLoop foreach ($token in $tokens) {
if ($token.Kind -ne 'Function') {
continue
}
$position = $token.Extent.StartLineNumber
do {
if (-not $foreach.MoveNext()) {
break tokenLoop
}
$token = $foreach.Current
} until ($token.Kind -in @('Generic', 'Identifier'))
$functionPosition = [pscustomobject]@{
Name = $token.Text
LineNumber = $position
Path = $item.FullName
}
Add-Member -InputObject $functionPosition `
-TypeName FunctionPosition -PassThru
}
}
}
catch {
throw
}
}
}