IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Foreach && Foreach-object


Sujet :

Scripts/Batch

  1. #1
    Membre éclairé
    Homme Profil pro
    test
    Inscrit en
    Mai 2016
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Algérie

    Informations professionnelles :
    Activité : test
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Mai 2016
    Messages : 347
    Par défaut Foreach && Foreach-object
    bonjour a tous

    Qui a une idée SVP sur le différence entre et Cela peut sembler facile pour certains d'entre vous mais ce n'est pas totalement clair pour moi

    merci pour nos experts

  2. #2
    Membre Expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Par défaut
    salut,

    Il te faut juste comprendre ce qu'est un objet en comparaison a une liste ou un array !

    Et tu comprendra la difference !

  3. #3
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1..3 | ForEach-Object {[int]$sum=''} {$sum+=$PSItem} {$sum} | Out-file ....
    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émoire

    pour plus d'aide tu peux consulter l'aide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    get-help ForEach-Object -full
    get-help about_Foreach -Category HelpFile

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    en complément à la réponse de I'm_HERE.

    Citation Envoyé par NULL008 Voir le message
    Qui a une idée SVP sur la différence entre et
    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 powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    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) :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    }
    On peut remplacer 5,20,-3 par un tableau
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :-)

Discussions similaires

  1. [MySQL] Imbrication de foreach dans un foreach
    Par coyote_064 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 16/11/2017, 12h32
  2. Différence: foreach((array)) et foreach()
    Par clement106 dans le forum Langage
    Réponses: 2
    Dernier message: 11/01/2010, 21h45
  3. Foreach List d'object
    Par topolino dans le forum ASP.NET
    Réponses: 6
    Dernier message: 25/11/2008, 14h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo