2015-03-19 15 views
10

C'è qualche differenza tra ForEach e ForEach-Object?Differenza tra ForEach e ForEach-Object nella PowerShell

Ho un piccolo codice come questo, funziona bene

$txt = Get-Content 'C:\temp\000.txt' 
$result = foreach ($line in $txt) {$line.replace(".ini","")} 
$result | out-file 'c:\temp\001.txt' 

Ma se io uso 'ForEach-Object', ho ottenuto gli errori ....

$txt = Get-Content 'C:\temp\000.txt' 
$result = foreach-object ($line in $txt) {$line.replace(".ini","")} 
$result | out-file 'c:\temp\001.txt' 

Perché? e come generare i risultati del ciclo utilizzando ForEach-Object

+1

https://social.technet.microsoft.com/Forums/en-US/e8da8249-ea91-4772-ae85-582a4b37425b/powershell-foreachobject-vs-foreach – dugas

risposta

7

foreach è uno pseudonimo di ForEach-Object ma sembra anche essere una parola chiave (che è fonte di confusione).

La sintassi foreach ($<item> in $<collection\>){<statement list>} utilizzata è help about_foreach.

Il come ForEach-Object alias è help ForEach-Object.

La parola chiave foreach opera su ogninello $<collection> come indicato nel bit ().

L'alias foreach/funzione ForEach-Object opera su ciascun elemento della raccolta che riceve come input.

+0

beh, se cambio il codice in 'ForEach- Object', ottengo errore 'Token imprevisto 'in' espressione o istruzione.' Manca chiusura ')' nell'espressione. 'Token imprevisto ')' in espressione o istruzione. ....... –

+0

Giusto. Perché 'ForEach-Object' non usa quella sintassi. Guarda i documenti di aiuto che ho elencato. –

9

Sono comandi diversi per scopi diversi. Il ForEach-Object cmdlet viene utilizzato in cantiere, e si utilizza $ PSItem o $ _ per fare riferimento all'oggetto corrente, al fine di eseguire un {scriptblock} in questo modo:

1..5 | ForEach-Object {$_} 

>1 
>2 
>3 
>4 
>5 

Ora, si può utilizzare anche una parola chiave , ForEach molto simile all'inizio di una riga. In questo caso, è possibile eseguire una {scriptblock} in cui si definisce il nome della variabile, in questo modo:

ForEach ($number in 1..5){$number} 
>1 
>2 
>3 
>4 
>5 

La differenza principale qui è dove si utilizza il comando, uno è utilizzato nel bel mezzo di una condotta, mentre l'altro inizia la propria pipeline. Negli script di stile di produzione, consigliamo di utilizzare la parola chiave ForEach anziché il cmdlet.

+0

Parole chiave: Oggetto ForEl utilizzato nella pipeline. simpatico. –

Problemi correlati