Compartilhar via


ForEach-Object

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

Sintaxe

ScriptBlockSet (Default)

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

PropertyAndMethodSet

ForEach-Object
    [-MemberName] <String>
    [-InputObject <PSObject>]
    [-ArgumentList <Object[]>]
    [-WhatIf]
    [-Confirm]
    [<CommonParameters>]

ParallelParameterSet

ForEach-Object
    -Parallel <ScriptBlock>
    [-InputObject <PSObject>]
    [-ThrottleLimit <Int32>]
    [-TimeoutSeconds <Int32>]
    [-AsJob]
    [-WhatIf]
    [-Confirm]
    [<CommonParameters>]

Description

O cmdlet ForEach-Object 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.

  • do bloco 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 os beginblocos , processe end conforme 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 Operation. 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. 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

  • Bloco de script em execução paralela. A partir do PowerShell 7.0, um terceiro conjunto de parâmetros está disponível que executa cada bloco de script em paralelo. O parâmetro ThrottleLimit limita o número de scripts paralelos em execução por vez. Como antes, use a $_ variável para representar o objeto de entrada atual no bloco de script. Use a $using: palavra-chave para passar referências de variáveis para o script em execução.

    No PowerShell 7, um novo runspace é criado para cada iteração de loop para garantir o isolamento máximo. Isso pode ser um grande desempenho e um impacto de recurso se o trabalho que você está fazendo for pequeno em comparação com a criação de novos runspaces ou se houver muitas iterações executando um trabalho significativo. A partir do PowerShell 7.1, os runspaces de um pool de runspaces são reutilizados por padrão. O tamanho do pool de runspace é especificado pelo parâmetro ThrottleLimit . O tamanho padrão do pool de runspaces é 5. Você ainda pode criar um novo runspace para cada iteração usando a opção UseNewRunspace .

    Por padrão, os scriptblocks paralelos usam o diretório de trabalho atual do chamador que iniciou as tarefas paralelas.

    Para obter mais informações, consulte a seção NOTES deste artigo.

Exemplos

Exemplo 1: dividir inteiros em uma matriz

Este exemplo usa 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 de instalação do PowerShell $PSHOME.

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 em 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 de processar os eventos.

$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}

Get-EventLog obtém os 1000 eventos mais recentes do log de eventos do sistema e os armazena na $Events variável. $Events em seguida, é canalizado para o ForEach-Object cmdlet. 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 de mensagem de cada um dos eventos nesse arquivo. Por fim, 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 o formulário ou o conteúdo de um valor de entrada do Registro.

Cada subchave na chave de rede representa uma unidade de rede mapeada que se reconecta ao entrar. A entrada RemotePath contém o caminho UNC da unidade conectada. Por exemplo, se você mapear a unidade E: para \\Server\Share, uma subchave E será criada com HKCU:\Network o valor do Registro RemotePath definido como \\Server\Share.

O comando usa o cmdlet para obter todas as subchaves da chave de de Rede e o 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 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 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

Este exemplo mostra o efeito de canalizar a variável $Null automática para o cmdlet ForEach-Object.

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

Como o PowerShell trata nulo como um espaço reservado explícito, o cmdlet ForEach-Object gera um valor para $Null, assim como acontece com outros objetos que você redireciona 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 alias Foreach 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ódulo em nomes de componente

Este exemplo mostra três maneiras de dividir dois nomes de módulo separados por pontos em seus nomes de componente. Os comandos chamam o método Split de cadeias de caracteres. Os três comandos usam sintaxe diferente, mas são equivalentes e intercambiáveis. A saída é a mesma para 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 colocar 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 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, 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 blocos intermediários são todos 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

Exemplo 11: Executar script lento em lotes paralelos

Este exemplo executa um bloco de script simples que avalia uma cadeia de caracteres e dorme por um segundo.

$Message = "Output:"

1..8 | ForEach-Object -Parallel {
    "$using:Message $_"
    Start-Sleep 1
} -ThrottleLimit 4
Output: 1
Output: 2
Output: 3
Output: 4
Output: 5
Output: 6
Output: 7
Output: 8

O valor do parâmetro ThrottleLimit é definido como 4 para que a entrada seja processada em lotes de quatro. A $using: palavra-chave é usada para passar a $Message variável para cada bloco de script paralelo.

Exemplo 12: Recuperar entradas de log em paralelo

Este exemplo recupera 50.000 entradas de log de 5 logs do sistema em um computador Windows local.

$logNames = 'Security','Application','System','Windows PowerShell','Microsoft-Windows-Store/Operational'

$logEntries = $logNames | ForEach-Object -Parallel {
    Get-WinEvent -LogName $_ -MaxEvents 10000
} -ThrottleLimit 5

$logEntries.Count
50000

O parâmetro Parallel especifica o bloco de script que é executado em paralelo para cada nome de log de entrada. O parâmetro ThrottleLimit garante que todos os cinco blocos de script são executados ao mesmo tempo.

Exemplo 13: Executar em paralelo como um trabalho

Este exemplo executa um bloco de script simples em paralelo, criando dois trabalhos em segundo plano por vez.

$job = 1..10 | ForEach-Object -Parallel {
    "Output: $_"
    Start-Sleep 1
} -ThrottleLimit 2 -AsJob

$job | Receive-Job -Wait
Output: 1
Output: 2
Output: 3
Output: 4
Output: 5
Output: 6
Output: 7
Output: 8
Output: 9
Output: 10

A $job variável recebe o objeto de trabalho que coleta dados de saída e monitora o estado de execução. O objeto de trabalho é canalizado com Receive-Job o parâmetro Wait switch. E isso transmite a saída para o console, como se ForEach-Object -Parallel tivesse sido executado sem AsJob.

Exemplo 14: Usando referências de variável segura de thread

Este exemplo invoca blocos de script em paralelo para coletar objetos de processo nomeados exclusivamente.

$threadSafeDictionary = [System.Collections.Concurrent.ConcurrentDictionary[string,object]]::new()
Get-Process | ForEach-Object -Parallel {
    $dict = $using:threadSafeDictionary
    $dict.TryAdd($_.ProcessName, $_)
}

$threadSafeDictionary["pwsh"]
 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     82    82.87     130.85      15.55    2808   2 pwsh

Uma única instância de um objeto ConcurrentDictionary é passada para cada bloco de script para coletar os objetos. Como o ConcurrentDictionary é thread-safe, é seguro ser modificado por cada script paralelo. Um objeto não thread-safe, como System.Collections.Generic.Dictionary, não seria seguro de usar aqui.

Observação

Este exemplo é um uso muito ineficiente do parâmetro Parallel . O script simplesmente adiciona o objeto de entrada a um objeto de dicionário simultâneo. É trivial e não vale a pena invocar cada script em um thread separado. Funcionar ForEach-Object normalmente sem o switch paralelo é muito mais eficiente e rápido. Este exemplo destina-se apenas a demonstrar como usar variáveis de thread safe.

Exemplo 15: Escrever erros com execução paralela

Este exemplo grava no fluxo de erros em paralelo, em que a ordem dos erros gravados é aleatória.

1..3 | ForEach-Object -Parallel {
    Write-Error "Error: $_"
}
Write-Error: Error: 1
Write-Error: Error: 3
Write-Error: Error: 2

Exemplo 16: Encerrando erros na execução paralela

Este exemplo demonstra um erro de encerramento em um bloco de scripts em execução paralela.

1..5 | ForEach-Object -Parallel {
    if ($_ -eq 3)
    {
        throw "Terminating Error: $_"
    }

    Write-Output "Output: $_"
}
Exception: Terminating Error: 3
Output: 1
Output: 4
Output: 2
Output: 5

Output: 3 nunca é escrito porque o scriptblock paralelo para essa iteração foi encerrado.

Observação

Não há suporte para variáveis de parâmetro comuns PipelineVariable em Foreach-Object -Parallel cenários, mesmo com a $using: palavra-chave.

Exemplo 17: Passando variáveis no script paralelo aninhado ScriptBlockSet

Você pode criar uma variável fora de um Foreach-Object -Parallel scriptblock com escopo e usá-la dentro do scriptblock com a $using palavra-chave.

$test1 = 'TestA'
1..2 | Foreach-Object -Parallel {
    $using:test1
}
TestA
TestA
# You CANNOT create a variable inside a scoped scriptblock
# to be used in a nested foreach parallel scriptblock.
$test1 = 'TestA'
1..2 | Foreach-Object -Parallel {
    $using:test1
    $test2 = 'TestB'
    1..2 | Foreach-Object -Parallel {
        $using:test2
    }
}
Line |
   2 |  1..2 | Foreach-Object -Parallel {
     |         ~~~~~~~~~~~~~~~~~~~~~~~~~~
     | The value of the using variable '$using:test2' cannot be retrieved because it has not been set in the local session.

O scriptblock aninhado não pode acessar a variável $test2 e um erro é gerado.

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.

Esse parâmetro foi introduzido no Windows PowerShell 3.0.

Propriedades do parâmetro

Tipo:

Object[]

Valor padrão:None
Dá suporte a curingas:False
DontShow:False
Aliases:Argumentos

Conjuntos de parâmetros

PropertyAndMethodSet
Cargo:Named
Obrigatório:False
Valor do pipeline:False
Valor do pipeline pelo nome da propriedade:False
Valor dos argumentos restantes:False

-AsJob

Faz com que a invocação paralela seja executada como um trabalho do PowerShell. Um único objeto de trabalho é retornado em vez da saída dos blocos de script em execução. O objeto de trabalho contém trabalhos filho para cada bloco de script paralelo executado. O objeto de trabalho pode ser usado por todos os cmdlets de trabalho do PowerShell para monitorar o estado de execução e recuperar dados.

Esse parâmetro foi introduzido no PowerShell 7.0.

Propriedades do parâmetro

Tipo:SwitchParameter
Valor padrão:None
Dá suporte a curingas:False
DontShow:False

Conjuntos de parâmetros

ParallelParameterSet
Cargo:Named
Obrigatório:False
Valor do pipeline:False
Valor do pipeline pelo nome da propriedade:False
Valor dos argumentos restantes:False

-Begin

Especifica um bloco de script executado antes que esse cmdlet processe objetos de entrada. Esse bloco de script só é executado uma vez para todo o pipeline. Para obter mais informações sobre o begin bloco, consulte about_Functions.

Propriedades do parâmetro

Tipo:ScriptBlock
Valor padrão:None
Dá suporte a curingas:False
DontShow:False

Conjuntos de parâmetros

ScriptBlockSet
Cargo:Named
Obrigatório:False
Valor do pipeline:False
Valor do pipeline pelo nome da propriedade:False
Valor dos argumentos restantes:False

-Confirm

Solicita sua confirmação antes de executar o cmdlet.

Propriedades do parâmetro

Tipo:SwitchParameter
Valor padrão:False
Dá suporte a curingas:False
DontShow:False
Aliases:cf

Conjuntos de parâmetros

(All)
Cargo:Named
Obrigatório:False
Valor do pipeline:False
Valor do pipeline pelo nome da propriedade:False
Valor dos argumentos restantes:False

-End

Especifica um bloco de script executado após esse cmdlet processar todos os objetos de entrada. Esse bloco de script só é executado uma vez para todo o pipeline. Para obter mais informações sobre o end bloco, consulte about_Functions.

Propriedades do parâmetro

Tipo:ScriptBlock
Valor padrão:None
Dá suporte a curingas:False
DontShow:False

Conjuntos de parâmetros

ScriptBlockSet
Cargo:Named
Obrigatório:False
Valor do pipeline:False
Valor do pipeline pelo nome da propriedade:False
Valor dos argumentos restantes:False

-InputObject

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

Quando você usa o parâmetro InputObject com ForEach-Object, em vez de canalizar resultados de comando para ForEach-Object, o valor 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 aqueles objetos que têm valores específicos em propriedades definidas, use ForEach-Object no pipeline, conforme mostrado nos exemplos deste tópico.

Propriedades do parâmetro

Tipo:PSObject
Valor padrão:None
Dá suporte a curingas:False
DontShow:False

Conjuntos de parâmetros

(All)
Cargo:Named
Obrigatório:False
Valor do pipeline:True
Valor do pipeline pelo nome da propriedade:False
Valor dos argumentos restantes:False

-MemberName

Especifica a propriedade a ser acessada 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. Por exemplo, se você executar Get-Process | ForEach -MemberName *Name, o padrão curinga corresponderá a mais de um membro, fazendo com que o comando falhe.

Esse parâmetro foi introduzido no Windows PowerShell 3.0.

Propriedades do parâmetro

Tipo:String
Valor padrão:None
Dá suporte a curingas:True
DontShow:False

Conjuntos de parâmetros

PropertyAndMethodSet
Cargo:0
Obrigatório:True
Valor do pipeline:False
Valor do pipeline pelo nome da propriedade:False
Valor dos argumentos restantes:False

-Parallel

Especifica o bloco de script a ser usado para processamento paralelo de objetos de entrada. Insira um bloco de script que descreve a operação.

Esse parâmetro foi introduzido no PowerShell 7.0.

Propriedades do parâmetro

Tipo:ScriptBlock
Valor padrão:None
Dá suporte a curingas:False
DontShow:False

Conjuntos de parâmetros

ParallelParameterSet
Cargo:Named
Obrigatório:True
Valor do pipeline:False
Valor do pipeline pelo nome da propriedade:False
Valor dos argumentos restantes:False

-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 process bloco, consulte about_Functions.

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 bloco process. 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 intermediários serão todos mapeados para o process bloco.

Propriedades do parâmetro

Tipo:

ScriptBlock[]

Valor padrão:None
Dá suporte a curingas:False
DontShow:False

Conjuntos de parâmetros

ScriptBlockSet
Cargo:0
Obrigatório:True
Valor do pipeline:False
Valor do pipeline pelo nome da propriedade:False
Valor dos argumentos restantes:False

-RemainingScripts

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

Esse parâmetro foi introduzido no Windows PowerShell 3.0.

Propriedades do parâmetro

Tipo:

ScriptBlock[]

Valor padrão:None
Dá suporte a curingas:False
DontShow:False

Conjuntos de parâmetros

ScriptBlockSet
Cargo:Named
Obrigatório:False
Valor do pipeline:False
Valor do pipeline pelo nome da propriedade:False
Valor dos argumentos restantes:False

-ThrottleLimit

Especifica o número de blocos de script que estão em paralelo. Os objetos de entrada são bloqueados até que a contagem de blocos de script em execução fique abaixo do ThrottleLimit. O valor padrão é 5.

Esse parâmetro foi introduzido no PowerShell 7.0.

Propriedades do parâmetro

Tipo:Int32
Valor padrão:5
Dá suporte a curingas:False
DontShow:False

Conjuntos de parâmetros

ParallelParameterSet
Cargo:Named
Obrigatório:False
Valor do pipeline:False
Valor do pipeline pelo nome da propriedade:False
Valor dos argumentos restantes:False

-TimeoutSeconds

Especifica o número de segundos a serem esperados para que todas as entradas sejam processadas em paralelo. Após o tempo limite especificado, todos os scripts em execução são interrompidos. E todos os objetos de entrada restantes a serem processados são ignorados. O valor padrão de desabilita 0 o tempo limite e ForEach-Object -Parallel pode ser executado indefinidamente. Digitar Ctrl+C na linha de comando interrompe um comando em execução ForEach-Object -Parallel . Esse parâmetro não pode ser usado junto com o parâmetro AsJob .

Esse parâmetro foi introduzido no PowerShell 7.0.

Propriedades do parâmetro

Tipo:Int32
Valor padrão:0
Dá suporte a curingas:False
DontShow:False

Conjuntos de parâmetros

ParallelParameterSet
Cargo:Named
Obrigatório:False
Valor do pipeline:False
Valor do pipeline pelo nome da propriedade:False
Valor dos argumentos restantes:False

-UseNewRunspace

Faz com que a invocação paralela crie um novo runspace para cada iteração de loop em vez de reutilizar runspaces do pool de runspaces.

Esse parâmetro foi introduzido no PowerShell 7.1

Propriedades do parâmetro

Tipo:SwitchParameter
Valor padrão:False
Dá suporte a curingas:False
DontShow:False

Conjuntos de parâmetros

ParallelParameterSet
Cargo:Named
Obrigatório:False
Valor do pipeline:False
Valor do pipeline pelo nome da propriedade:False
Valor dos argumentos restantes:False

-WhatIf

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

Propriedades do parâmetro

Tipo:SwitchParameter
Valor padrão:False
Dá suporte a curingas:False
DontShow:False
Aliases:wi

Conjuntos de parâmetros

(All)
Cargo:Named
Obrigatório:False
Valor do pipeline:False
Valor do pipeline pelo nome da propriedade:False
Valor dos argumentos restantes:False

CommonParameters

Este cmdlet suporta os parâmetros comuns: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction e -WarningVariable. Para obter mais informações, consulte about_CommonParameters.

Entradas

PSObject

Você pode redirecionar qualquer objeto para este cmdlet.

Saídas

PSObject

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

Observações

O cmdlet funciona muito parecido 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, métodos Where e ForEach foram adicionados para uso com coleções. Você pode ler mais sobre esses novos métodos aqui about_arrays

Usando ForEach-Object -Parallel:

  • O ForEach-Object -Parallel conjunto de parâmetros usa a API interna do PowerShell para executar cada bloco de script em um novo runspace. Isso é significativamente mais sobrecarga do que executar ForEach-Object normalmente com processamento sequencial. É importante usar Parallel onde a sobrecarga de execução em paralelo é pequena em comparação com o trabalho que o bloco de script executa. Por exemplo:

    • Computar scripts intensivos em computadores de vários núcleos
    • Scripts que gastam tempo aguardando resultados ou fazendo operações de arquivo

    Usar o parâmetro Parallel pode fazer com que os scripts sejam executados muito mais lentos do que o normal. Especialmente se os scripts paralelos forem triviais. Experimente o Parallel para descobrir onde ele pode ser benéfico.

  • Ao executar em paralelo, não é possível garantir que os objetos decorados com ScriptProperties ou ScriptMethods funcionem corretamente se forem executados em um espaço de execução diferente daquele em que os scripts foram originalmente anexados a eles.

    A invocação do Scriptblock sempre tenta ser executada em seu home runspace, independentemente de onde ela seja realmente invocada. No entanto, ForEach-Object -Parallel cria runspaces temporários que são excluídos após o uso, portanto, não há mais nenhum runspace para os scripts serem executados.

    Esse comportamento pode funcionar desde que o home runspace ainda exista. No entanto, talvez você não obtenha o resultado desejado se o script depender de variáveis externas que só estão presentes no runspace do chamador e não no home runspace.

  • Erros de não terminação são gravados no fluxo de erros do cmdlet, pois ocorrem em blocos de script em execução paralela. Como a ordem de execução do scriptblock paralelo não é determinística, a ordem na qual os erros aparecem no fluxo de erros é aleatória. Da mesma forma, as mensagens gravadas em outros fluxos de dados, como aviso, detalhado ou informações, são gravadas nesses fluxos de dados em uma ordem indeterminado.

    Os erros de encerramento, como exceções, encerram a instância paralela individual dos blocos de script nos quais eles ocorrem. Um erro de encerramento em um scriptblocks pode não causar o encerramento do Foreach-Object cmdlet. Os outros scriptblocks, em execução em paralelo, continuam a ser executados, a menos que também encontrem um erro de encerramento. O erro de encerramento é gravado no fluxo de dados de erro como um ErrorRecord com um FullyQualifiedErrorId de PSTaskException. Os erros de encerramento podem ser convertidos em erros de não encerramento usando blocos try/catch ou trap do PowerShell.

  • Não há suporte para variáveis de parâmetro comuns PipelineVariable em cenários paralelos, mesmo com a $using: palavra-chave.

    Importante

    O ForEach-Object -Parallel conjunto de parâmetros executa blocos de script em paralelo em threads de processo separados. A $using: palavra-chave permite passar referências de variáveis do thread de invocação do cmdlet para cada thread de bloco de script em execução. Como os blocos de script são executados em threads diferentes, as variáveis de objeto passadas por referência devem ser usadas com segurança. Geralmente, é seguro ler de objetos referenciados que não mudam. Mas se o estado do objeto estiver sendo modificado, você deverá usar objetos thread-safe, como tipos .NET System.Collection.Concurrent (consulte o Exemplo 11).