bonjour a tous
Qui a une idée SVP sur le différence entreetCode:Foreach
Cela peut sembler facile pour certains d'entre vous mais ce n'est pas totalement clair pour moiCode:Foreach-object
merci pour nos experts
Version imprimable
bonjour a tous
Qui a une idée SVP sur le différence entreetCode:Foreach
Cela peut sembler facile pour certains d'entre vous mais ce n'est pas totalement clair pour moiCode:Foreach-object
merci pour nos experts
salut,
Il te faut juste comprendre ce qu'est un objet en comparaison a une liste ou un array !
Et tu comprendra la difference !
salut,
d'abord +1 pour sachadee :)
foreach-object est un cmdlet inspiré du language AWK qui utilise un bloc d'initialisation, un bloc de traitement et un
bloc de finalization pour mieux traiter et gérer les entrées par le pipeline, elle est donc plus orienté shell par
contre le statement foreach est plus destiné à la
programmation classique, les programmeurs qui sont rescapés d'autres languages vers PS ne se trouveront pas depaysé
en plus chaque boucle à ses propres points forts/faibles par exemple dans un statement foreach on peux utiliser la variable spécial $foreach et les libellé par contre elle n'accepte pas l'entrée du pipeline directement
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 PS C:\> 1..3 | foreach($i in $_) {$i} Au caractère Ligne:1 : 19 + 1..3 | foreach($i in $_) {$i} + ~~ Jeton inattendu «*in*» dans l’expression ou l’instruction. Au caractère Ligne:1 : 18 + 1..3 | foreach($i in $_) {$i} + ~ Parenthèse fermante «*)*» manquante dans l’expression. Au caractère Ligne:1 : 24 + 1..3 | foreach($i in $_) {$i} + ~ Jeton inattendu «*)*» dans l’expression ou l’instruction. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : UnexpectedToken PS C:\> 1..3 | &{foreach($i in $input) {$i}} 1 2 3 PS C:\>
par contre le cmdlet foreach-object (alias: foreach et %) est plus flexible si on utilise le pipeline:
mais avec des données assez grandes ça peux être long vu qu'on utilise le pipeline d'ou l'ajout du paramètre commun OutBuffer qui peux nous aider un peu sur ce problème d'allocation de mémoireCode:1..3 | ForEach-Object {[int]$sum=''} {$sum+=$PSItem} {$sum} | Out-file ....
pour plus d'aide tu peux consulter l'aide:
Code:
1
2 get-help ForEach-Object -full get-help about_Foreach -Category HelpFile
Salut,
en complément à la réponse de I'm_HERE.
Elle font la même chose, mais pas de la même manière :-)
Foreach est une instruction du langage, elle parcourt une collection existante élément par élément et elle propose une variable automatique dans le corps de la boucle qui pointe sur l'énumérateur.
Foreach-Object est un cmdlet natif de Powershell, conceptuellement il fait la même chose à la différence qu'il est dédié au pipeline et qu'il propose des blocs Begin (initialisation), Process et End (finalisation).
Ici la collection n'a pas besoin d'exister, Foreach-Object traite les objets au fur et à mesure de leur production ( émis par Get-Process par exemple).
Foreach est aussi un alias de ce cmdlet tout comme le caractère '%'. A la lecture c'est le contexte qui détermine lequel on utilise.
Code:
1
2
3
4 $_='Avant' 5,20,-3 | Foreach-Object -Begin { "Setup" } -Process {$_ * $_} -End { "Cleanup" } Write-Host "$_" #la variable automatique à une portée locale au pipeline
Une réécriture avec un Foreach (itérateur) :
On peut remplacer 5,20,-3 par un tableauCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 "Setup" $v=$null Foreach ($V in 5,20,-3) {$V * $V} "Cleanup" Write-Host "$V" #la variable $V persiste Foreach ($V in 5,20,-3) {"`$V=$V" $foreach.MoveNext()>$null # on avance de un dans la collection au sein de la boucle "Accès explicite à Current=$($foreach.Current)" #une fois la collection entièrement parcourue, Current ne renvoi plus rien } Foreach ($V in 5,20,-3) { #Qu'est-ce que $Foreach ,$foreach|Get-member Break }
Code:
1
2
3 $T=@(5,20,-3) Foreach ($V in $T)...
Il est préférable d'utiliser l'instruction Foreach qui est plus rapide et plus facile à gérer en cas de réécriture.
On peut aussi considérer l'arrêt de l'itération (mot-clé break) ou la gestion des $null, mais c'est déjà de la plomberie :-)