Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Krótki opis
Opisuje polecenie języka, którego można użyć do przechodzenia wszystkich elementów w kolekcji elementów.
Długi opis
Instrukcja foreach jest konstrukcją języka do iteracji nad zestawem wartości w kolekcji.
Najprostszym i najbardziej typowym typem kolekcji do przechodzenia jest tablica.
foreach W ramach 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 wewnątrz nawiasu foreach reprezentuje zmienną i kolekcję do iteracji. Program PowerShell tworzy zmienną $<item> automatycznie po uruchomieniu foreach pętli. Na początku każdej iteracji foreach ustawia zmienną elementu na następną wartość w kolekcji. Blok {<statement list>} zawiera polecenia do wykonania dla każdej iteracji.
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 element $letterArray zawiera wartości ciągów a, b, ci d. Przy pierwszym uruchomieniu instrukcji foreach ustawia zmienną $letter równą pierwszemu elementowi w $letterArray elemencie (a). Następnie używa Write-Host go do wyświetlania wartości. Następnym razem za $letter pomocą pętli jest ustawiona wartość b. Wzorzec powtarza się dla każdego elementu w tablicy.
Można również użyć foreach instrukcji z poleceniami cmdlet, które zwracają kolekcję elementów. W poniższym przykładzie foreach instrukcja przechodzi przez listę elementów zwracanych przez Get-ChildItem polecenie cmdlet.
foreach ($file in Get-ChildItem)
{
Write-Host $file
}
Możesz uściślić przykład, używając instrukcji if , aby ograniczyć zwracane wyniki. W poniższym przykładzie if instrukcja ogranicza 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 ma wszystkie właściwości obiektu zwrócone przez Get-ChildItemobiekt .
W następnym przykładzie skrypt wyświetla 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
}
}
Można również używać zmiennych spoza foreach 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 100KB in the current directory.'
}
else {
Write-Host 'No files greater than 100KB in the current directory.'
}
W poprzednim przykładzie $i zaczyna się od wartości 0 spoza pętli.
$i Następnie jest zwiększany wewnątrz pętli dla każdego pliku, który jest większy niż 100 KB. Gdy pętla kończy działanie, if instrukcja oblicza wartość $i w celu wyświetlenia liczby plików powyżej 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, aby pokazać wyniki w kilobajtach, a nie bajtach, a wynikowa wartość jest następnie formatowana przy użyciu specyfikatora formatu stałego punktu w celu usunięcia wszystkich wartości dziesiętnych z wyniku. Element 0 sprawia, że specyfikator formatu nie pokazuje miejsc dziesiętnych.
Poniższa funkcja analizuje skrypty programu PowerShell i moduły skryptów i zwraca lokalizację funkcji zawartych w programie . W przykładzie pokazano, jak używać MoveNext metody i Current właściwości $foreach zmiennej wewnątrz bloku skryptu foreach .
Aby uzyskać więcej informacji, zobacz Using Enumerators (Korzystanie z 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
}
$addMemberSplat = @{
InputObject = $functionPosition
TypeName = 'FunctionPosition'
PassThru = $true
}
Add-Member @addMemberSplat
}
}
}
catch {
throw
}
}
}