Question Get-Child et ForEach

Plus d'informations
il y a 17 ans 1 mois #3951 par steph_d
Get-Child et ForEach a été créé par steph_d
Bonjour
J'ai un souci avec ces commandes voici mon bout de code:

$listeFichiers = get-childitem cde*.* | Foreach{$_.name}
ForEach ($fichier in $listeFichiers)
{}

Le problème c'est que même si je n'ai aucun fichier cde*.* je rentre dans la boucle ForEach ce qui provoque bien évidement des erreurs puisqu'ensuite j'essaie de lire un fichier qui n'existe pas. A priori $listeFichiers est bien vide, j'ai essayé en le mettant = $null et pareil je rentre quand même dans le ForEach.
Y' a quelqu'un qui aurait une explication un paliatif ?

Merci
Stephane

@+ Steph

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 1 mois #3953 par steph_d
Réponse de steph_d sur le sujet Re:Get-Child et ForEach
Euh pardon, je copierai 100 fois pour demain:
google est mon amis et à quoi ça sert que Janel se décarcasse

janel.spaces.live.com/blog/cns!9B5AA3F6FA0088C2!238.entry

L'explication complète du fonctionnement de la boucle ForEach y est.

Stephane @+ Steph

@+ Steph

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 1 mois #3955 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Get-Child et ForEach
steph_d écrit:

Y' a quelqu'un qui aurait une explication un paliatif ?

On trouve une explication et une discusion à ce sujet sur MsConnect, voir le texte suivant.
Le code d'origine
[code:1]
$listeFichiers = get-childitem cde*.* | Foreach{$_.name}
ForEach ($fichier in $listeFichiers)
{write-host \"boucle\"
$fichiers -eq $null
gv fichier
}[/code:1]
Il faut déplacer la première instruction dans le corps de la boucle, qui elle gére aussi le pipeline :
[code:1]
ForEach ($fichier in get-childitem cde*.* | Foreach{$_.name})
{write-host \"boucle\"
$fichiers -eq $null
gv fichier
}[/code:1]
C'est ce genre de comportement qui parfois fait perdre pas mal de temps. Et ce n'est pas précisé dans la doc :angry: .
C'est un des pièges de PowerShell.
En recherchant \"PowerShell Gotcha\" sur google on en trouve quelques autres.

MSCONNECT : connect.microsoft.com/feedback/ViewFeedb...281908&SiteID=99

I like that foreach iterates over a scalar value in addition to collections. However I see no scenario where executing the loop body when the scalar value is $null is actually useful!RemarquesThis is by design. $null is treated as a scalar value.
You can use array subexpression to force $files to be an array.
$files = @(gci *.snoopydance)

Publié par Microsoft le 08/06/2007 à 08:26
The current behaviour is by design but requires an explanation. In PowerShell, the value null is a scalar value. A collection can contain multiple nulls in which case a foreach runs multiple times:

foreach ($i in $null,$null,$null) { } # runs three times
foreach ($i in $null, $null) {} # runs twice
foreach ($i in $null) {} # runs *once* as one would expect from this sequence.

The example in the repro is an instance where this behaviour, while consistent and reasoanble (i.e. one can infer the behaviour by a set of rules) it is inconvenient. For this reason, PowerShell has special syntax to handle address this scenario. If the pipeline in question is always required to return an enumerable collection, then it can be run inside of @( ... ) as in

PS (MTA-V1) (39) > $files = @( gci *.snoopydance )
PS (MTA-V1) (40) > foreach ($file in $files) { [datetime]::SpecifyKind($file.LastWriteTime, 'Utc') }
PS (MTA-V1) (41) >

Now there is no issue - the body of the foreach command is never run because $files contains an empty collection instead of null.

Publié par Microsoft le 12/01/2009 à 19:18

...


Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.083 secondes
Propulsé par Kunena