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 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 a
de cadeia de caracteres , , b
c
, 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
}
}
}