Foreach versus Foreach-Object

Il m’arrive d’animer des formations Powershell, et j’aborde toujours dans ces moments la différence entre le Foreach et le Foreach-Object. C’est une vraie source de confusion, pour différentes raisons.

Je vais essayer dans ce sujet d’apporter un peu d’explications sur ce qui pose vraiment un si gros problème de compréhension.

A mon avis, le plus … « confusant », c’est ce que propose l’IDE intégré aux OS Windows, j’ai nommé Windows Powershell ISE.

Puisque si je cherche à comprendre depuis l’IDE ce qu’est la différence entre Foreach et Foreach-Object … je pars sur de très très mauvaises bases.
La commande d’affichage des alias est formelle, foreach est un simple alias de Foreach-Object.

Pour rappel, un alias de commande Powershell est (source éditeur : https://learn.microsoft.com/fr-fr/powershell/scripting/learn/shell/using-aliases?WT.mc_id=AZ-MVP-5003759&view=powershell-7.3)

Un alias est un nom alternatif ou un nom abrégé pour une cmdlet ou pour un élément de commande, comme une fonction, un script, un fichier ou un fichier exécutable. Vous pouvez exécuter la commande en utilisant l’alias au lieu du nom de l’exécutable.

Oui, mais non. Mais oui, mais finalement, non.

Ce qui est écrit n’est pas faux, mais il faut être très précis sur les termes utilisés.
pour une cmdlet ou pour un élément de commande, comme une fonction, un script, un fichier ou un fichier exécutable

Pas pour une instruction.

Retour sur l’ISE pour profiter de la colorimétrie intégrée et pour commencer à mieux comprendre le sujet. La colorimétrie est une aide précieuse lors de l’écriture de code, elle va rendre le code beaucoup plus lisible, c’est un indispensable. Sur l’écran suivant, test de couleurs avec une variable, une cmdlet ou commande et une instruction.

3 couleurs différentes qui facilitent l’identification. En rouge, la variable $a, en bleu, la cmdlet Get-Command et en bleu très foncé, l’instruction switch.
Même test avec le Foreach.

Saisie du texte Foreac, sans la dernière lettre de la commande, l’IDE à cet instant est sur une couleur de type commande :

Ajout de la dernière lettre (le h), l’IDE à cet instant est sur sur une couleur de type instruction comme le montre la changement de colorimétrie et l’erreur syntaxique en rouge qui attend les informations complémentaires pour cette instruction.

Dernier test avec l’utilisation de la tabulation qui permet de compléter la commande et ainsi d’éviter la saisie complète. L’IDE saute d’une couleur de type instruction à une couleur de type commande.

Il n’en faut pas bien plus pour que la commande et l’instruction soient régulièrement source de confusion.

Ainsi, on n’utilise pas ces deux Foreach dans les mêmes cas.

Foreach-Object attend un « collection » en entrée de commande. Un exemple (colorimétrie = bleu = cmdlet) :

10, 20, 30 | ForEach-Object {write-host "Mon chiffre $($_)"}

Foreach exploite du contenu ligne à ligne depuis des valeurs d’entrées (lists, variables…etc). C’est une instruction d’itération. Un exemple (colorimétrie = bleu foncé = instruction) :

Pour l’aide de la Cmdlet, c’est ici : https://learn.microsoft.com/fr-fr/powershell/module/microsoft.powershell.core/foreach-object?WT.mc_id=AZ-MVP-5003759&view=powershell-7.3

Pour l’instruction, c’est ici : https://learn.microsoft.com/fr-fr/powershell/module/microsoft.powershell.core/about/about_foreach?WT.mc_id=AZ-MVP-5003759&view=powershell-7.3

J’espère que ce court article permettra à certaines / certains d’entre vous de mieux appréhender le Foreach.

Laisser un commentaire