Question ForEach est-il obligatoire

Plus d'informations
il y a 15 ans 4 mois #7968 par jojo
ForEach est-il obligatoire a été créé par jojo
bonjour, :laugh:

il y a un problème que je n'ai pas pu résoudre, voici mes test:

[code:1]PS> ls *.txt
-a--- 05/12/2003 13:15 7798 sendkeys.txt
-a--- 29/03/2010 06:17 5170 table.txt

PS> ls | gm
TypeName: System.IO.FileInfo

Name MemberType Definition
----

Mode CodeProperty System.String Mode{get=Mode;}
AppendText Method System.IO.StreamWriter AppendText()
...
.....
.....
Length Property System.Int64 Length {get;}
Name Property System.String Name {get;}

# donc il y a une propriété \"NAME\"

PS> (ls *.txt).name
PS>
PS> ls *.txt | ForEach { $_.name }
sendkeys.txt
table.txt[/code:1]

voici ma question:
comment pouvons-nous exploiter les proprités/méthodes d'une commande sans passer par un un pipe \"|\"

voir l'exemple:
[code:1](ls *.txt).name # pourquoi ça ne marche pas
ls *.txt | ForEach { $_.name }[/code:1]

merci :laugh:<br><br>Message édité par: jojo, à: 26/10/10 19:19

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

Plus d'informations
il y a 15 ans 4 mois #7971 par Vara
Réponse de Vara sur le sujet Re:ForEach est-il obligatoire
Salut Jojo,

essaye avec ça:

[code:1]
ls | Select-Object name
[/code:1]

Seb

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

Plus d'informations
il y a 15 ans 4 mois #7972 par jojo
Réponse de jojo sur le sujet Re:ForEach est-il obligatoire
me revoila :laugh:
bonsoir Vara

mais ce que je voulais est de mettre le paramètre ou la fonction sans utiliser le pipe \&quot;|\&quot;

pourquoi ceci fonctionne:

[code:1]\&quot;hello\&quot;.getEnumerator()[/code:1]

par contre:

[code:1](ls *.txt).name[/code:1]

ne fonctionne pas

merci :laugh:

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

Plus d'informations
il y a 15 ans 4 mois #7973 par Laurent Dardenne
Salut,
jojo écrit:

[code:1](ls *.txt).name # pourquoi ça ne marche pas
[/code:1]

La notion d'objet associe une information à une seule instance, un seul objet, ici, c'est à dire avec le couple de parenthèses, tu manipules un tableau.
Un tableau n'a pas de propriété Name, sauf si tu l'ajoutes et quand bien même elle ne concernerait que l'instance du tableau.

Le foreach énumère la collection, ton tableau, ainsi la propriété Name existe sur chaque objet traité un par un.
L'instruction Foreach ou le cmdlet Foreach appel en interne l'énumérateur (GetEnumerator()), qui précise de traiter les éléments un par un:
[code:1]
$T=ls *.txt
$Enumerator=$T.GetEnumerator()
#traite l'objet pas la collection
,$Enumerator|gm
[/code:1]
Il est possible de ne pas utiliser de pipeline, à la place on utilise de l'aspirine générique :
[code:1]
#sous réserve qu'aucun répertoire ne 'match'
[System.IO.FileSystemInfo[]]$T=ls *.txt
$delegate= [System.Action[System.IO.FileSystemInfo]]{ param($item); Write-host $item.Name}
[System.Reflection.MethodInfo] $Methode = [System.Array].GetMethod(\&quot;ForEach\&quot;«»)
$MethodeGenerique = $Methode.MakeGenericMethod([System.IO.FileSystemInfo])
$MethodeGenerique.Invoke($null,@($T,$delegate))
[/code:1]
Comme tu peux, presque, le voir, on ne peut s'affranchir de l'itération de la collection.
\&quot;Un\&quot; et \&quot;plusieurs\&quot; sont deux concepts différent, donc pour répondre à ta question oui le foreach est obligatoire.

Ceci reste possible, mais on ne manipule plus que des string :
[code:1]
$ofs=\&quot;`r`n\&quot;;\&quot;$(ls *.txt).name\&quot;
[/code:1]
Une question en amenant une autre, ici, je te laisserai creuser le pourquoi du comment ;-)<br><br>Message édité par: Laurent Dardenne, à: 26/10/10 22:42

Tutoriels PowerShell

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

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