Partilhar via


ForEach-Object

Executa uma operação em relação a cada item em uma coleção de objetos de entrada.

Sintaxe

ForEach-Object
            [-InputObject <PSObject>]
            [-Begin <ScriptBlock>]
            [-Process] <ScriptBlock[]>
            [-End <ScriptBlock>]
            [-RemainingScripts <ScriptBlock[]>]
            [-WhatIf]
            [-Confirm]
            [<CommonParameters>]
ForEach-Object
            [-InputObject <PSObject>]
            [-MemberName] <String>
            [-ArgumentList <Object[]>]
            [-WhatIf]
            [-Confirm]
            [<CommonParameters>]

Description

O cmdlet ForEach-Object executa uma operação em cada item de uma coleção de objetos de entrada. Os objetos de entrada podem ser canalizados para o cmdlet ou especificados usando o parâmetro InputObject.

A partir do Windows PowerShell 3.0, há duas maneiras diferentes de construir um comando ForEach-Object.

  • Bloco de script. Você pode usar um bloco de script para especificar a operação. Dentro do bloco de script, use a variável $_ para representar o objeto atual. O bloco de script é o valor do parâmetro Process. O bloco de script pode conter qualquer script do PowerShell.

    Por exemplo, o comando a seguir obtém o valor da propriedade ProcessName de cada processo no computador.

    Get-Process | ForEach-Object {$_.ProcessName}

  • Declaração de operação. Você também pode escrever uma instrução de operação, que é muito mais parecida com linguagem natural. Você pode usar a instrução operation para especificar um valor de propriedade ou chamar um método. As instruções de operação foram introduzidas no Windows PowerShell 3.0.

    Por exemplo, o comando a seguir também obtém o valor da propriedade ProcessName de cada processo no computador.

    Get-Process | ForEach-Object ProcessName

    Ao usar o formato de bloco de script, além de usar o bloco de script que descreve as operações executadas em cada objeto de entrada, você pode fornecer dois blocos de script adicionais. O bloco de script Begin, que é o valor do parâmetro Begin, é executado antes que esse cmdlet processe o primeiro objeto de entrada. O bloco de script End, que é o valor do parâmetro End, é executado depois que esse cmdlet processa o último objeto de entrada.

Exemplos

Exemplo 1: Dividir inteiros em uma matriz

30000, 56798, 12432 | ForEach-Object -Process {$_/1024}

29.296875
55.466796875
12.140625

Este comando pega uma matriz de três inteiros e divide cada um deles por 1024.

Exemplo 2: Obter o comprimento de todos os arquivos em um diretório

Get-ChildItem $pshome | ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}

Esse comando obtém os arquivos e diretórios no diretório de instalação do PowerShell $pshome e os passa para o cmdlet ForEach-Object. Se o objeto não for um diretório, o bloco de script obterá o nome do arquivo, dividirá o valor de sua propriedade Length por 1024 e adicionará um espaço (" ") para separá-lo da próxima entrada. O cmdlet usa a propriedade PSISContainer para determinar se um objeto é um diretório.

Exemplo 3: Operar nos eventos mais recentes do Sistema

$Events = Get-EventLog -LogName System -Newest 1000
$events | ForEach-Object -Begin {Get-Date} -Process {Out-File -FilePath Events.txt -Append -InputObject $_.Message} -End {Get-Date}

Este comando obtém os 1000 eventos mais recentes do log de eventos do sistema e os armazena na variável $Events. Em seguida, canaliza os eventos para o cmdlet ForEach-Object.

O parâmetro Begin exibe a data e a hora atuais. Em seguida, o parâmetro Process usa o cmdlet Out-File para criar um arquivo de texto chamado events.txt e armazena a propriedade message de cada um dos eventos nesse arquivo. Por último, o parâmetro End é usado para exibir a data e a hora após a conclusão de todo o processamento.

Exemplo 4: Alterar o valor de uma chave do Registro

Get-ItemProperty -Path HKCU:\Network\* | ForEach-Object {Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper();}

Este comando altera o valor da entrada de registo RemotePath em todas as subchaves sob a chave HKCU:\Network para texto em maiúsculas. Você pode usar esse formato para alterar a forma ou o conteúdo de um valor de entrada do Registro.

Cada subchave na chave Network representa uma unidade de rede mapeada que se reconectará no logon. A entrada RemotePath contém o caminho UNC da unidade conectada. Por exemplo, se você mapear a unidade E: para \\Server\Share, haverá uma subchave E de HKCU:\Network e o valor da entrada do Registro RemotePath na subchave E será \\Server\Share.

O comando usa o cmdlet para obter todas as subchaves da chave Network e o cmdlet para alterar o valor da entrada do Registro RemotePath em cada chave. No comando Set-ItemProperty, o caminho é o valor da propriedade PSPath da chave do Registro. Esta é uma propriedade do objeto Microsoft .NET Framework que representa a chave do Registro, não uma entrada do Registro. O comando usa o método ToUpper() do RemotePath valor, que é uma cadeia de caracteres (REG_SZ).

Como Set-ItemProperty está alterando a propriedade de cada chave, o cmdlet ForEach-Object é necessário para acessar a propriedade.

Exemplo 5: Usar a variável automática $Null

1, 2, $null, 4 | ForEach-Object {"Hello"}

Hello
Hello
Hello
Hello

Este exemplo mostra o efeito da canalização da variável automática $Null para o cmdlet ForEach-Object.

Como o PowerShell trata null como um espaço reservado explícito, o cmdlet ForEach-Object gera um valor para $Null, assim como faz para outros objetos que você canaliza para ele.

Para obter mais informações sobre a variável automática $Null, consulte about_Automatic_Variables.

Exemplo 6: Obter valores de propriedade

Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path

Esses comandos obtém o valor da propriedade Path de todos os módulos do PowerShell instalados. Eles usam o parâmetro MemberName para especificar a propriedade Path dos módulos.

O segundo comando é equivalente ao primeiro. Ele usa o alias Foreach do cmdlet ForEach-Object e omite o nome do parâmetro MemberName, que é opcional.

O cmdlet ForEach-Object é muito útil para obter valores de propriedade, porque obtém o valor sem alterar o tipo, ao contrário dos cmdlets Format ou do cmdlet Select-Object, que alteram o tipo de valor da propriedade.

Exemplo 7: Dividir nomes de módulos em nomes de componentes

"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | ForEach-Object {$_.Split(".")}
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | ForEach-Object -MemberName Split -ArgumentList "."
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | Foreach Split "."

Microsoft
PowerShell
Core
Microsoft
PowerShell
Host

Esses comandos dividem dois nomes de módulos separados por pontos em seus nomes de componentes. Os comandos chamam o Split método de cadeias de caracteres. Os três comandos usam sintaxe diferente, mas são equivalentes e intercambiáveis.

O primeiro comando usa a sintaxe tradicional, que inclui um bloco de script e o operador de objeto atual $_. Ele usa a sintaxe de ponto para especificar o método e parênteses para incluir o argumento delimitador.

O segundo comando usa o parâmetro MemberName para especificar o método Split e o parâmetro ArgumentName para identificar o ponto (".") como o delimitador de divisão.

O terceiro comando usa o alias Foreach do cmdlet Foreach-Object e omite os nomes dos parâmetros MemberName e ArgumentList, que são opcionais.

A saída desses três comandos, mostrada abaixo, é idêntica.

Split é apenas um dos muitos métodos úteis de strings. Para ver todas as propriedades e métodos de cadeias de caracteres, canalize uma cadeia de caracteres para o cmdlet Get-Member.

Parâmetros

-ArgumentList

Especifica uma matriz de argumentos para uma chamada de método.

Esse parâmetro foi introduzido no Windows PowerShell 3.0.

Tipo:Object[]
Aliases:Args
Position:Named
Default value:None
Necessário:False
Aceitar entrada de pipeline:False
Aceitar carateres universais:False

-Begin

Especifica um bloco de script que é executado antes que este cmdlet processe quaisquer objetos de entrada.

Tipo:ScriptBlock
Position:Named
Default value:None
Necessário:False
Aceitar entrada de pipeline:False
Aceitar carateres universais:False

-Confirm

Solicita confirmação antes de executar o cmdlet.

Tipo:SwitchParameter
Aliases:cf
Position:Named
Default value:False
Necessário:False
Aceitar entrada de pipeline:False
Aceitar carateres universais:False

-End

Especifica um bloco de script que é executado depois que esse cmdlet processa todos os objetos de entrada.

Tipo:ScriptBlock
Position:Named
Default value:None
Necessário:False
Aceitar entrada de pipeline:False
Aceitar carateres universais:False

-InputObject

Especifica os objetos de entrada. ForEach-Object executa o bloco de script ou a instrução de operação em cada objeto de entrada. Insira uma variável que contenha os objetos ou digite um comando ou expressão que obtenha os objetos.

Quando você usa o parâmetro InputObject com ForEach-Object, em vez de canalizar os resultados do comando para ForEach-Object, o valor de InputObject é tratado como um único objeto. Isso é verdadeiro mesmo se o valor for uma coleção que é o resultado de um comando, como -InputObject (Get-Process). Como InputObject não pode retornar propriedades individuais de uma matriz ou coleção de objetos, recomendamos que, se você usar ForEach-Object para executar operações em uma coleção de objetos para esses objetos que têm valores específicos em propriedades definidas, use ForEach-Object no pipeline, conforme mostrado nos exemplos deste tópico.

Tipo:PSObject
Position:Named
Default value:None
Necessário:False
Aceitar entrada de pipeline:True
Aceitar carateres universais:False

-MemberName

Especifica a propriedade a ser obtida ou o método a ser chamado.

Caracteres curinga são permitidos, mas funcionam somente se a cadeia de caracteres resultante for resolvida para um valor exclusivo. Se, por exemplo, você executar Get-Process | ForEach -MemberName *Namee existir mais de um membro com um nome que contenha a cadeia de caracteres Name, como o ProcessName e Name propriedades, o comando falhará.

Esse parâmetro foi introduzido no Windows PowerShell 3.0.

Tipo:String
Position:0
Default value:None
Necessário:True
Aceitar entrada de pipeline:False
Aceitar carateres universais:True

-Process

Especifica a operação que é executada em cada objeto de entrada. Insira um bloco de script que descreva a operação.

Tipo:ScriptBlock[]
Position:0
Default value:None
Necessário:True
Aceitar entrada de pipeline:False
Aceitar carateres universais:False

-RemainingScripts

Especifica todos os blocos de script que não são tomados pelo parâmetro Process.

Esse parâmetro foi introduzido no Windows PowerShell 3.0.

Tipo:ScriptBlock[]
Position:Named
Default value:None
Necessário:False
Aceitar entrada de pipeline:False
Aceitar carateres universais:False

-WhatIf

Mostra o que aconteceria se o cmdlet fosse executado. O cmdlet não é executado.

Tipo:SwitchParameter
Aliases:wi
Position:Named
Default value:False
Necessário:False
Aceitar entrada de pipeline:False
Aceitar carateres universais:False

Entradas

PSObject

Você pode canalizar qualquer objeto para este cmdlet.

Saídas

PSObject

Este cmdlet retorna objetos que são determinados pela entrada.

Notas

  • O cmdlet funciona de forma muito semelhante à instrução Foreach, exceto que você não pode canalizar a entrada para uma instrução Foreach. Para obter mais informações sobre a instrução Foreach, consulte about_Foreach.
  • A partir do PowerShell 4.0, os métodos Where e ForEach foram adicionados para uso com coleções.
  • Você pode ler mais sobre esses novos métodos aqui about_arrays