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 linguagem que você pode usar para percorrer todos os itens em uma coleção de itens.
Descrição longa
A foreach instrução é uma construção de linguagem para iterar em um conjunto de valores em uma coleção.
O tipo mais simples e típico de coleção a ser percorrido é uma matriz.
Dentro de um foreach loop, é comum executar um ou mais comandos em cada item em uma matriz.
Sintaxe
O seguinte mostra a foreach sintaxe:
foreach ($<item> in $<collection>){<statement list>}
A parte da foreach instrução entre parênteses representa uma variável e uma coleção a ser iterada. O PowerShell cria a variável $<item> automaticamente quando o foreach loop é executado. No início de cada iteração, foreach define a variável item para o próximo valor na coleção. O {<statement list>} bloco contém os comandos a serem executados para cada iteração.
Exemplos
Por exemplo, o foreach loop no exemplo a seguir exibe os valores na $letterArray matriz.
$letterArray = 'a','b','c','d'
foreach ($letter in $letterArray)
{
Write-Host $letter
}
Neste exemplo, o $letterArray contém os valores ade cadeia de caracteres , b, ce d. Na primeira vez que a foreach instrução é executada, ela define a $letter variável igual ao primeiro item em $letterArray (a). Em seguida, ele usa Write-Host para exibir o valor. Na próxima vez que passar pelo loop, $letter é definido como b. O padrão se repete para cada item na matriz.
Você também pode usar foreach instruções com cmdlets que retornam uma coleção de itens. No exemplo a seguir, a foreach instrução percorre a lista de itens retornados pelo Get-ChildItem cmdlet.
foreach ($file in Get-ChildItem)
{
Write-Host $file
}
Você pode refinar o exemplo usando uma if instrução para limitar os resultados retornados. No exemplo a seguir, a instrução limita if os resultados a arquivos com mais de 100 KB (kilobytes):
foreach ($file in Get-ChildItem)
{
if ($file.Length -gt 100KB)
{
Write-Host $file
}
}
Neste exemplo, o foreach loop usa uma propriedade da variável para executar uma operação de $file comparação ($file.Length -gt 100KB). A $file variável tem todas as propriedades do objeto retornado pelo Get-ChildItem.
No próximo exemplo, o script exibe o comprimento e a hora do último 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 foreach loop. 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 if instrução avalia o valor de $i para exibir uma contagem de arquivos com mais 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 kilobytes em vez de bytes, e o valor resultante é formatado usando o especificador de formato de ponto fixo para remover quaisquer valores decimais do resultado. Isso 0 faz com que o especificador de formato não mostre casas decimais.
A função a seguir analisa scripts do PowerShell e módulos de script e retorna o local das funções contidas neles. O exemplo demonstra como usar o MoveNext método e a Current propriedade da $foreach variável dentro de um foreach bloco de script.
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
}
}
}