Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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 foreach instrução é 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 foreach loop, é comum executar um ou mais comandos em cada item de uma matriz.
Sintaxe
A sintaxe é mostrada a foreach seguir:
foreach ($<item> in $<collection>){<statement list>}
A parte da foreach instrução entre parênteses representa uma variável e uma coleção para iterar. 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 de 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 , , bc, e 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. A 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 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 para arquivos maiores que 100 kilobytes (KB):
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 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 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 100KB. Quando o loop é encerrado, uma if instrução avalia o valor de para exibir uma contagem de $i 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 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
}
}
}