Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Descrição curta
Descreve um comando de idioma que você pode usar para percorrer todos os itens em uma coleção de itens.
Descrição longa
A instrução foreach é um constructo de linguagem para iteração em um conjunto de valores em uma coleção.
O tipo mais simples e típico de coleção a percorrer é uma matriz.
Em um loop foreach, é comum executar um ou mais comandos em cada item em uma matriz.
Sintaxe
O seguinte mostra a sintaxe foreach:
foreach ($<item> in $<collection>){<statement list>}
A parte da instrução foreach dentro de parênteses representa uma variável e uma coleção para iterar. O PowerShell cria a variável $<item> automaticamente quando o loop foreach é executado. No início de cada iteração, foreach define a variável de item como o próximo valor na coleção. O bloco {<statement list>} contém os comandos a serem executados para cada iteração.
Exemplos
Por exemplo, o loop foreach no exemplo a seguir exibe os valores na matriz $letterArray.
$letterArray = 'a','b','c','d'
foreach ($letter in $letterArray)
{
Write-Host $letter
}
Neste exemplo, o $letterArray contém os valores de cadeia de caracteres a, b, ce d. Na primeira vez em que a instrução foreach é executada, ela define a variável $letter igual ao primeiro item em $letterArray (a). Em seguida, ele usa Write-Host para exibir o valor. Na próxima vez pelo loop, $letter será definido como b. O padrão se repete para cada item na matriz.
Você também pode usar instruções foreach com cmdlets que retornam uma coleção de itens. No exemplo a seguir, a instrução foreach percorre a lista de itens retornados pelo cmdlet Get-ChildItem.
foreach ($file in Get-ChildItem)
{
Write-Host $file
}
Você pode refinar o exemplo usando uma instrução if para limitar os resultados retornados. No exemplo a seguir, a instrução if limita os resultados a arquivos maiores que 100 quilobytes (KB):
foreach ($file in Get-ChildItem)
{
if ($file.Length -gt 100KB)
{
Write-Host $file
}
}
Neste exemplo, o loop foreach usa uma propriedade da variável $file para executar uma operação de comparação ($file.Length -gt 100KB). A variável $file tem todas as propriedades do objeto retornadas pelo Get-ChildItem.
No exemplo a seguir, o script exibe o comprimento e o último tempo de acesso dentro da lista de instruções:
foreach ($file in Get-ChildItem)
{
if ($file.Length -gt 100KB)
{
Write-Host $file
Write-Host $file.Length
Write-Host $file.LastAccessTime
}
}
Você também pode usar variáveis de fora de um loop de foreach. O exemplo a seguir conta arquivos com mais de 100 KB de tamanho:
$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.'
}
No exemplo anterior, $i começa com um valor de 0 fora do loop.
Em seguida, $i é incrementado dentro do loop para cada arquivo maior que 100 KB. Quando o loop é encerrado, uma instrução if avalia o valor de $i para exibir uma contagem de arquivos acima de 100 KB.
O exemplo anterior também demonstra como formatar os resultados do comprimento do arquivo:
($file.Length / 1024).ToString('F0')
O valor é dividido por 1.024 para mostrar os resultados em quilobytes em vez de bytes, e o valor resultante é formatado usando o especificador de formato de ponto fixo para remover quaisquer valores decimais do resultado. O 0 faz com que o especificador de formato não mostre casas decimais.
A função a seguir analisa scripts e módulos de script do PowerShell e retorna o local das funções contidas. O exemplo demonstra como usar o MoveNext método e a Current propriedade da $foreach variável dentro de um foreach bloco de instrução.
Para obter mais informações, consulte Usando enumeradores.
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
}
}
}
Consulte também
- about_Automatic_Variables
- about_If
- forEach-object