about_Foreach
Descrição breve
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 (também conhecida como foreach
loop) é um constructo de linguagem para percorrer (iterar) uma série de valores em uma coleção de itens.
O tipo de coleção mais simples e típico a ser percorrido é uma matriz.
Dentro de um foreach
loop, é comum executar um ou mais comandos em cada item em uma matriz.
Syntax
O seguinte mostra a foreach
sintaxe:
foreach ($<item> in $<collection>){<statement list>}
A parte da instrução foreach
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. Antes de cada iteração por meio do loop, a variável é definida como um valor na coleção.
O bloco após uma foreach
instrução {<statement list>}
contém um conjunto de comandos a serem executados em cada item em uma coleçã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, a $letterArray
matriz é criada e inicializada com os valores de cadeia de caracteres "a"
, "b"
, "c"
e "d"
. Na primeira vez que a foreach
instrução é executada, ela define a $letter
variável como igual ao primeiro item em $letterArray
("a"
). Em seguida, ele usa o Write-Host
cmdlet para exibir a letra a. Na próxima vez por meio do loop, $letter
é definido "b"
como e assim por diante. Depois que o foreach
loop exibe a letra d, o PowerShell sai do loop.
foreach
As instruções também podem ser usadas junto com cmdlets que retornam uma coleção de itens. No exemplo a seguir, a instrução Foreach 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 instrução if
para limitar os resultados retornados. No exemplo a seguir, a foreach
instrução executa a mesma operação de loop que o exemplo anterior, mas adiciona uma instrução if
para limitar 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 $file
variável para executar uma operação de comparação ($file.length -gt 100KB
). A $file
variável contém todas as propriedades no objeto que é retornado pelo Get-ChildItem
cmdlet . Portanto, você pode retornar mais do que apenas um nome de arquivo.
No próximo exemplo, o PowerShell retorna 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
}
}
Neste exemplo, você não está limitado a executar um único comando em uma lista de instruções.
Você também pode usar uma variável fora de um foreach
loop e incrementar a variável dentro do 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 100 KB in the current directory."
}
else {
Write-Host "No files greater than 100 KB in the current directory."
}
No exemplo anterior, a $i
variável é definida como 0
fora do loop e a variável é incrementada dentro do loop para cada arquivo encontrado com mais de 100 KB. Quando o loop é encerrado, uma instrução if
avalia o valor de $i
para exibir uma contagem de todos os arquivos acima de 100 KB. Ou exibe uma mensagem informando que nenhum arquivo com mais de 100 KB foi encontrado.
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.
No exemplo a seguir, a função definida analisa os scripts do PowerShell e os módulos de script e retorna o local das funções contidas no . O exemplo demonstra como usar o MoveNext
método (que funciona de forma semelhante a skip X
em um For
loop) e a Current
propriedade da $foreach
variável dentro de um bloco de script foreach. A função de exemplo pode encontrar funções em um script mesmo se houver definições de função espaçadas de forma incomum ou inconsistente que abrangem várias linhas.
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
}
Add-Member -InputObject $functionPosition `
-TypeName FunctionPosition -PassThru
}
}
}
catch {
throw
}
}
}