Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Kort beskrivning
Beskriver ett språkkommando som du kan använda för att bläddra igenom alla objekt i en samling objekt.
Lång beskrivning
Instruktionen foreach är en språkkonstruktion för iterering över en uppsättning värden i en samling.
Den enklaste och mest typiska typen av samling att iterera genom är en array.
I en foreach-loop är det vanligt att köra ett eller flera kommandon mot varje objekt i en matris.
Syntax
Följande visar syntaxen för foreach:
foreach ($<item> in $<collection>){<statement list>}
Delen av foreach-instruktionen inom parentes representerar en variabel och en samling som ska iterera. PowerShell skapar variabeln $<item> automatiskt när foreach-loopen körs. I början av varje iteration anger foreach objektvariabeln till nästa värde i samlingen. Det {<statement list>} blocket innehåller de kommandon som ska köras för varje iteration.
Exempel
Till exempel visar foreach-loopen i följande exempel värdena i matrisen $letterArray.
$letterArray = 'a','b','c','d'
foreach ($letter in $letterArray)
{
Write-Host $letter
}
I det här exemplet innehåller $letterArray strängvärdena a, b, coch d. Första gången foreach-instruktionen körs anger den $letter variabeln som det första objektet i $letterArray (a). Sedan används Write-Host för att visa värdet. Nästa gång du går igenom loopen är $letter inställd på b. Mönstret upprepas för varje objekt i matrisen.
Du kan också använda foreach-instruktioner med cmdletar som returnerar en samling objekt. I följande exempel stegar foreach-instruktionen igenom listan över objekt som returneras av cmdleten Get-ChildItem.
foreach ($file in Get-ChildItem)
{
Write-Host $file
}
Du kan förfina exemplet med hjälp av en if-instruktion för att begränsa de resultat som returneras. I följande exempel begränsar if-instruktionen resultatet till filer som är större än 100 kilobyte (KB):
foreach ($file in Get-ChildItem)
{
if ($file.Length -gt 100KB)
{
Write-Host $file
}
}
I det här exemplet använder foreach-loopen en egenskap för variabeln $file för att utföra en jämförelseåtgärd ($file.Length -gt 100KB). Variabeln $file har alla egenskaper för objektet som returneras av Get-ChildItem.
I nästa exempel visar skriptet längden och den senaste åtkomsttiden i instruktionslistan:
foreach ($file in Get-ChildItem)
{
if ($file.Length -gt 100KB)
{
Write-Host $file
Write-Host $file.Length
Write-Host $file.LastAccessTime
}
}
Du kan också använda variabler utanför en foreach-loop. I följande exempel räknas filer över 100 KB i storlek:
$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.'
}
I föregående exempel börjar $i med värdet 0 utanför loopen.
Sedan ökas $i inuti loopen för varje fil som är större än 100 KB. När loopen avslutas utvärderar en if-instruktion värdet för $i för att visa antalet filer över 100 KB.
I föregående exempel visas också hur du formaterar fillängdsresultatet:
($file.Length / 1024).ToString('F0')
Värdet divideras med 1 024 för att visa resultatet i kilobyte i stället för byte, och det resulterande värdet formateras sedan med hjälp av fastpunktsformatsspecificeraren för att ta bort eventuella decimalvärden från resultatet.
0 gör att formatspecificeraren inte visar några decimaler.
Följande funktion parsar PowerShell-skript och skriptmoduler och returnerar platsen för funktioner som finns i. Exemplet visar hur du använder MoveNext metoden och Current egenskapen för variabeln $foreach i ett foreach instruktionsblock.
Mer information finns i Using Enumerators.
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
}
}
}