ForEach-Object
Executa uma operação em cada item de 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 ForEach-Object
cmdlet executa uma operação em cada item em 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 ForEach-Object
comando.
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}
ForEach-Object
Suporta osbegin
blocos ,process
e conformeend
descrito em about_functions.Observação
Os blocos de script são executados no escopo do chamador. Portanto, os blocos têm acesso a variáveis nesse escopo e podem criar novas variáveis que persistem nesse escopo após a conclusão do cmdlet.
Instrução de operação. Você também pode escrever uma instrução de operação, que é muito mais parecida com a linguagem natural. Você pode usar a instrução de operação para especificar um valor de propriedade ou chamar um método. 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
Exemplos
Exemplo 1: Dividir inteiros em uma matriz
Este exemplo pega uma matriz de três inteiros e divide cada um deles por 1024.
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
Exemplo 2: Obter o comprimento de todos os arquivos em um diretório
Este exemplo processa os arquivos e diretórios no diretório $PSHOME
de instalação do PowerShell.
Get-ChildItem $PSHOME |
ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}
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
Este exemplo grava os 1000 eventos mais recentes do log de eventos do sistema em um arquivo de texto. A hora atual é exibida antes e depois do processamento dos eventos.
Get-EventLog -LogName System -Newest 1000 |
ForEach-Object -Begin {Get-Date} -Process {
Out-File -FilePath Events.txt -Append -InputObject $_.Message
} -End {Get-Date}
Get-EventLog
obtém os 1000 eventos mais recentes do log de eventos do sistema e os canaliza para o ForEach-Object
cmdlet. O parâmetro Begin exibe a data e a hora atuais. Em seguida, o parâmetro Process usa o Out-File
cmdlet 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
Este exemplo altera o valor da entrada do Registro RemotePath em todas as subchaves sob a chave para texto HKCU:\Network
em maiúsculas.
Get-ItemProperty -Path HKCU:\Network\* |
ForEach-Object {
Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper()
}
Você pode usar esse formato para alterar a forma ou o conteúdo de um valor de entrada de registro.
Cada subchave na chave de rede representa uma unidade de rede mapeada que se reconecta no logon. A entrada RemotePath contém o caminho UNC da unidade conectada. Por exemplo, se você mapear a unidade para \\Server\Share
, uma subchave E será criada com HKCU:\Network
o valor do Registro RemotePath definido como \\Server\Share
.E:
O comando usa o Get-ItemProperty
cmdlet para obter todas as subchaves da chave de rede e o Set-ItemProperty
cmdlet para alterar o valor da entrada do Registro RemotePath em cada chave. Set-ItemProperty
No comando, o caminho é o valor da propriedade PSPath da chave do Registro. Essa é uma propriedade do objeto do Microsoft .NET Framework que representa a chave do Registro, não uma entrada do Registro. O comando usa o método ToUpper() do valor RemotePath , que é uma string REG_SZ.
Como Set-ItemProperty
está alterando a propriedade de cada chave, o ForEach-Object
cmdlet é necessário para acessar a propriedade.
Exemplo 5: Usar a variável automática $null
Este exemplo mostra o efeito de canalizar a $null
variável automática para o ForEach-Object
cmdlet.
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
Como o PowerShell é tratado $null
como um espaço reservado explícito, o ForEach-Object
cmdlet gera um valor para $null
como faz para outros objetos canalizados para ele.
Exemplo 6: Obter valores de propriedade
Este exemplo obtém o valor da propriedade Path de todos os módulos do PowerShell instalados usando o parâmetro MemberName do ForEach-Object
cmdlet.
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path
O segundo comando é equivalente ao primeiro. Ele usa o Foreach
alias do ForEach-Object
cmdlet e omite o nome do parâmetro MemberName , que é opcional.
O ForEach-Object
cmdlet é útil para obter valores de propriedade, pois obtém o valor sem alterar o tipo, ao contrário dos cmdlets Format ou do Select-Object
cmdlet, que alteram o tipo de valor da propriedade.
Exemplo 7: Dividir nomes de módulos em nomes de componentes
Este exemplo mostra três maneiras de dividir dois nomes de módulos separados por pontos em seus nomes de componentes. Os comandos chamam o método Split de cadeias de caracteres. Os três comandos usam uma sintaxe diferente, mas são equivalentes e intercambiáveis. A saída é a mesma para todos os três casos.
"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
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 ArgumentList para identificar o ponto (.
) como o delimitador de divisão.
O terceiro comando usa o alias Foreach do ForEach-Object
cmdlet e omite os nomes dos parâmetros MemberName e ArgumentList , que são opcionais.
Exemplo 8: Usando ForEach-Object com dois blocos de script
Neste exemplo, passamos dois blocos de script posicionalmente. Todos os blocos de script são associados ao parâmetro Process . No entanto, eles são tratados como se tivessem sido passados para os parâmetros Begin e Process .
1..2 | ForEach-Object { 'begin' } { 'process' }
begin
process
process
Exemplo 9: Usando ForEach-Object com mais de dois blocos de script
Neste exemplo, passamos quatro blocos de script posicionalmente. Todos os blocos de script são associados ao parâmetro Process . No entanto, eles são tratados como se tivessem sido passados para os parâmetros Begin, Process e End.
1..2 | ForEach-Object { 'begin' } { 'process A' } { 'process B' } { 'end' }
begin
process A
process B
process A
process B
end
Observação
O primeiro bloco de script é sempre mapeado para o begin
bloco, o último bloco é mapeado para o end
bloco e os dois blocos do meio são mapeados para o process
bloco.
Exemplo 10: Executar vários blocos de script para cada item de pipeline
Conforme mostrado no exemplo anterior, vários blocos de script passados usando o parâmetro Process são mapeados para os parâmetros Begin e End. Para evitar esse mapeamento, você deve fornecer valores explícitos para os parâmetros Begin e End.
1..2 | ForEach-Object -Begin $null -Process { 'one' }, { 'two' }, { 'three' } -End $null
one
two
three
one
two
three
Parâmetros
-ArgumentList
Especifica uma matriz de argumentos para uma chamada de método. Para obter mais informações sobre o comportamento de ArgumentList, consulte about_Splatting.
Este parâmetro foi introduzido no Windows PowerShell 3.0.
Tipo: | Object[] |
Aliases: | Args |
Cargo: | Named |
Valor padrão: | None |
Obrigatório: | False |
Aceitar a entrada de pipeline: | False |
Aceitar caracteres curinga: | False |
-Begin
Especifica um bloco de script que é executado antes que esse cmdlet processe qualquer objeto de entrada. Esse bloco de script é executado apenas uma vez para todo o pipeline. Para obter mais informações sobre o bloqueio, consulte about_Functionsbegin
.
Tipo: | ScriptBlock |
Cargo: | Named |
Valor padrão: | None |
Obrigatório: | False |
Aceitar a entrada de pipeline: | False |
Aceitar caracteres curinga: | False |
-Confirm
Solicita sua confirmação antes de executar o cmdlet.
Tipo: | SwitchParameter |
Aliases: | cf |
Cargo: | Named |
Valor padrão: | False |
Obrigatório: | False |
Aceitar a entrada de pipeline: | False |
Aceitar caracteres curinga: | False |
-End
Especifica um bloco de script que é executado depois que esse cmdlet processa todos os objetos de entrada. Esse bloco de script é executado apenas uma vez para todo o pipeline. Para obter mais informações sobre o bloqueio, consulte about_Functionsend
.
Tipo: | ScriptBlock |
Cargo: | Named |
Valor padrão: | None |
Obrigatório: | False |
Aceitar a entrada de pipeline: | False |
Aceitar caracteres curinga: | 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 contém os objetos ou digite um comando ou uma expressão que obtém 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 InputObject é tratado como um único objeto. Isso é verdadeiro mesmo que o valor seja uma coleção resultante 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 os objetos que têm valores específicos em propriedades definidas, use ForEach-Object
no pipeline, conforme mostrado nos exemplos deste tópico.
Tipo: | PSObject |
Cargo: | Named |
Valor padrão: | None |
Obrigatório: | False |
Aceitar a entrada de pipeline: | True |
Aceitar caracteres curinga: | False |
-MemberName
Especifica o nome da propriedade de membro a ser obtida ou o método de membro a ser chamado. Os membros devem ser membros de instância, não membros estáticos.
Caracteres curinga são permitidos, mas funcionam somente se a cadeia de caracteres resultante for resolvida para um valor exclusivo.
Por exemplo, se você executar Get-Process | ForEach -MemberName *Name
o , o padrão curinga corresponderá a mais de um membro, fazendo com que o comando falhe.
Este parâmetro foi introduzido no Windows PowerShell 3.0.
Tipo: | String |
Cargo: | 0 |
Valor padrão: | None |
Obrigatório: | True |
Aceitar a entrada de pipeline: | False |
Aceitar caracteres curinga: | True |
-Process
Especifica a operação executada em cada objeto de entrada. Esse bloco de script é executado para cada objeto no pipeline. Para obter mais informações sobre o bloqueio, consulte about_Functionsprocess
.
Quando você fornece vários blocos de script para o parâmetro Process , o primeiro bloco de script é sempre mapeado para o begin
bloco. Se houver apenas dois blocos de script, o segundo bloco será mapeado para o process
bloco. Se houver três ou mais blocos de script, o primeiro bloco de script será sempre mapeado para o begin
bloco, o último bloco será mapeado para o end
bloco e os blocos do meio serão mapeados para o process
bloco.
Tipo: | ScriptBlock[] |
Cargo: | 0 |
Valor padrão: | None |
Obrigatório: | True |
Aceitar a entrada de pipeline: | False |
Aceitar caracteres curinga: | False |
-RemainingScripts
Especifica todos os blocos de script que não são usados pelo parâmetro Process .
Este parâmetro foi introduzido no Windows PowerShell 3.0.
Tipo: | ScriptBlock[] |
Cargo: | Named |
Valor padrão: | None |
Obrigatório: | False |
Aceitar a entrada de pipeline: | False |
Aceitar caracteres curinga: | False |
-WhatIf
Mostra o que aconteceria se o cmdlet fosse executado. O cmdlet não é executado.
Tipo: | SwitchParameter |
Aliases: | wi |
Cargo: | Named |
Valor padrão: | False |
Obrigatório: | False |
Aceitar a entrada de pipeline: | False |
Aceitar caracteres curinga: | False |
Entradas
Você pode canalizar qualquer objeto para esse cmdlet.
Saídas
Esse cmdlet retorna objetos que são determinados pela entrada.
Observações
O Windows PowerShell inclui os seguintes aliases para ForEach-Object
:
%
foreach
O ForEach-Object
cmdlet funciona de forma muito parecida com a 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, Where
os ForEach
métodos foram adicionados para uso com coleções. Você pode ler mais sobre esses novos métodos aqui about_arrays