Por que o ForEach se comporta de maneira diferente de%, apesar de serem ambos aliases do ForEach-Object no Powershell?

6

Por alguma razão, o% alias para ForEach-Object lança uma exceção ao usar a sintaxe ($ Thing in $ Things) enquanto o alias ForEach funciona bem.

Aqui estão dois exemplos:

Usando o% alias:

$ints = @(1, 2, 3, 4, 5)
% ($i in $ints)
{Write-Host $i}

Isso falha com o erro Inesperado token 'in' na expressão ou instrução.

Usando o alias do ForEach:

$ints = @(1, 2, 3, 4, 5)
foreach ($i in $ints)
{Write-Host $i}

Isso é bem-sucedido sem problemas.

Por que há uma diferença se ambos são aliases do ForEach-Object?

    
por Chris Magnuson 05.01.2012 / 21:02

1 resposta

13

Estas são duas coisas diferentes:

% é o alias para o cmdlet ForEach-Object e foreach é também o alias para o cmdlet ForEach-Object ... e foreach é uma instrução de looping que não funciona com pipelining.

Conforme escrito, seu primeiro comando se expande para:

ForEach-Object ($i in $ints) {
  Write-Host $i 
}

... que não é uma sintaxe válida para o cmdlet ForEach-Object .

Quando foreach aparece, como no segundo comando, ele é interpretado como uma instrução foreach , não como o alias do cmdlet. Nesse caso, a sintaxe é válida e faz o loop conforme o esperado.

Você pode comparar as diferenças com get-help about_Foreach e get-help ForEach-Object . Esta postagem do blog Essencial PowerShell: Entendendo o foreach também faz um bom trabalho explicando.

    
por 05.01.2012 / 21:08

Tags