Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Breve descrição
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 é uma construção de linguagem para iterar sobre um conjunto de valores em uma coleção.
O tipo de coleção mais simples e típico a percorrer é uma matriz.
Dentro de um loop de foreach, é comum executar um ou mais comandos em cada item de uma matriz.
Sintaxe
A seguir mostra a sintaxe foreach:
foreach ($<item> in $<collection>){<statement list>}
A parte da instrução foreach entre parênteses representa uma variável e uma coleção a serem iteradas. O PowerShell cria a variável $<item> automaticamente quando o loop de foreach é executado. No início de cada iteração, foreach define a variável de item para 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 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. Da próxima vez através do loop, $letter é 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 kilobytes (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 retornado pelo Get-ChildItem.
No exemplo seguinte, o script exibe o comprimento e a última hora 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 100KB. Quando o loop é encerrado, uma instrução if avalia o valor de $i para exibir uma contagem de arquivos com mais de 100KB.
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. 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 nele. O exemplo demonstra como usar o MoveNext método e a Current propriedade da $foreach variável dentro de um foreach bloco de instruções.
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