Question Questions/Réponses d'un vrai débutant

Plus d'informations
il y a 15 ans 4 mois #7986 par Jean-Christophe
Bonjour,
nouveau sur le forum, débutant en powershell et également en langage orienté objet, je me permets de soliciter votre aide pour mon apprentissage.

voilà depuis quelques jours j'essaie d'apprendre ce langage qui s'averera très productif dans mon job.

après avoir lu pas mal de tuto pour débuter et comprendre ps, je commence à tenter de mettre les mains dans le camboui :)

Je travaille sur la commande suivante :

[code:1]Get-ChildItem|Where-Object {$_.PSIsContainer}
[/code:1]
Pas de soucis je comprends bien tout ce qui s'y passe.
Alors je me lance des petits exos. Et dès le premier je sèche :
Afficher la valeur de la propriété PSIsContainer pour chaque élément renvoyé par gci.
Pour moi la solution était :
[code:1]Get-childItem|write-output{_$.psiscontainer}[/code:1]
Bon c'est pas ça. Et après de nombreuse recherche j'avoue être un peu perdu.

si vous avez une piste, je suis preneur.
Et oui le forum \"Entraide pour les débutants\" n'aura surement jamais aussi bien porté son nom :)

Merci par avance.

Jean-Christophe<br><br>Message édité par: Pouic, à: 4/11/10 14:33

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

Plus d'informations
il y a 15 ans 4 mois #7987 par EROS
Réponse de EROS sur le sujet Re:lire propriete psiscontainer
Bonjour Pouic,

Pour moi la solution était :
[code:1]Get-childItem|write-output{_$.psiscontainer}[/code:1]

es-tu certain que ton code est \&quot;_$\&quot; et non pas \&quot;$_\&quot;

:)
@+<br><br>Message édité par: Khalim EROS, à: 3/11/10 17:25

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

Plus d'informations
il y a 15 ans 4 mois #7990 par Jacques Barathon
Déjà, en effet il vaut mieux taper $_ que _$. :)

Mais même en corrigeant cette coquille, je doute que ça marche. En effet, la commande get-childitem retourne une collection d'objets, il faut donc qu'en sortie de pipeline tu envoies le résultat à une commande qui sache traiter la collection.

Or, write-output ne sait traiter qu'un objet, pas une collection. Le $_ n'a donc aucun sens pour cette commande si tu ne lui indiques pas quelque chose en plus.

Ce qui manque, c'est une instruction qui va prendre un à un les objets envoyés par le pipeline et les transmettre à write-output. En l'occurrence, c'est foreach-object qui pourra faire l'affaire :

PS&gt; get-childitem | foreach-object {write-output \&quot;$_.PSIsContainer\&quot;}

Cela dit, le résultat risque de ne pas être très lisible, surtout si tu as beaucoup de fichiers et de répertoires. Il faudrait compléter l'affichage en précisant d'autres propriétés des objets, au moins leur nom, histoire de savoir à quoi se rapporte le contenu de PSIsContainer.

Pour afficher plusieurs propriétés à la fois sur une collection d'objets, tu peux utiliser la commande format-table en lui précisant simplement les noms des propriétés que tu veux afficher :

PS&gt; get-childitem | format-table name, PSIsContainer -auto

J'ai ajouté le paramètre -auto (autosize de son nom complet) pour ajuster la taille des colonnes automatiquement, ce qui facilitera encore plus la lisibilité.

A l'inverse de write-output, format-table sait récupérer une collection d'objets envoyée par le pipeline.

N'hésite pas à continuer la discussion si tout ça n'est pas encore très clair !<br><br>Message édité par: janel, à: 3/11/10 17:58

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

Plus d'informations
il y a 15 ans 4 mois #7993 par Laurent Dardenne
janel écrit:

Ce qui manque, c'est une instruction qui va prendre un à un les objets envoyés par le pipeline et les transmettre à write-output. En l'occurrence, c'est foreach-object qui pourra faire l'affaire :

On peut aussi utiliser cette astuce :
[code:1]get-childitem | write-output -inputobject {$_.PSIsContainer}[/code:1]
janel écrit:

Cela dit, le résultat risque de ne pas être très lisible,

+1
En même temps, le résultat correspond à ce que l'on demande ;)<br><br>Message édité par: Laurent Dardenne, à: 4/11/10 11:22

Tutoriels PowerShell

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

Plus d'informations
il y a 15 ans 4 mois #7995 par Jean-Christophe
bonjour,

bien m'en a pris de découvrir votre site, votre forum et donc ses participants. Merci à vous pour votre aide et surtout vos explications qui me permettent de mieux comprendre ce langage.

Tout d'abord oui j'ai fait une erreur de frappe sur le post avec mon _$.

Vos explications ont été très claires, et m'ont permis de bien comprendre mes erreurs.

J'ai quelques questions d'ordre plus général.

(Surtout me reprendre lors de mes explications sur l'utilisation des termes car je pense qu'il faut bien connaitre les termes pour pouvoir bien connaitre le language objet)

Si je lis l'aide de write-output, concernant l'option -inputobject :

Spécifie les objets à envoyer à travers le pipeline. Entrez une variable contenant les objets, ou tapez une commande ou une expression permettant d'obtenir ces objets.


je me dis tiens je vais tenter un truc débile puisque celà ne m'apporte rien, mais pour etre bien sur de comprendre la terminologie de l'aide :

[code:1]Write-Output -InputObject {Get-ChildItem}[/code:1]

Pour moi gci est bien une commande permettant d'obtenir des objets. Mais j'ai l'erreur suivante :

Impossible d'évaluer le paramètre « InputObject », car son argument est s
pécifié en tant que bloc de script et qu'il n'y a pas d'entrée. Un bloc de script ne peut pas être évalué sans entrée.

Que veulent il dire par \&quot;Un bloc de script ne peut pas être évalué sans entrée\&quot;

J'avoue que mes manips n'ont pas de sens à proprement parler, mais mon objectif est vraiment de manipuler les commandes, les termes, les objets.

Je vous parlerez de mon premier projet d'ici peu quand je me sentirais capable de sortir un script sans pour autant avoir besoin de votre aide toutes les 2 lignes de codes :)

Merci encore pour votre aide

Jean-Christophe

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

Plus d'informations
il y a 15 ans 4 mois #7996 par Jacques Barathon
Dans le cas où tu utilisais $_, tu récupérais les objets envoyés par le pipeline. Il fallait donc mettre $_ dans un contexte de \&quot;script block\&quot; (série de commandes comprise par PowerShell comme un bloc autonome) qui allait pouvoir être exécuté pour chaque objet reçu.

Dans le cas où tu n'utilises plus le pipeline pour recevoir les objets émis par get-childitem, le \&quot;script block\&quot; n'a plus d'intérêt pour -inputobject. Là, ce qu'il te faut c'est simplement mettre la commande entre parenthèses pour que PowerShell l'évalue comme une expression et transmette son (ou ses) résultat(s) au paramètre :

PS&gt; write-output -inputobject (get-childitem)

Avec cette syntaxe : d'abord, get-childitem est exécuté, et tous les objets émis par la commande sont envoyés sous forme de tableau au paramètre -inputobject. Write-output émet alors vers le flux standard (la console à priori) le contenu du tableau.

Evidemment, comme tu le dis toi-même, l'intérêt d'une telle construction est très limité dans ce cas précis, mais ça peut en effet te permettre de comprendre les subtilités de la syntaxe de PowerShell. :)

Par exemple, il est important de garder à l'esprit que dans cet exemple, write-output attend que la commande passée en paramètre soit complètement exécutée avant d'en afficher les résultats. Si tu tapes ceci :

PS&gt; write-output -inputobject (get-childitem c:\windows -rec)

... tu devras attendre un bon moment que toute l'arborescence de c:\windows soit parcourue avant de voir le contenu s'afficher (à part les messages d'erreur qui eux seront envoyés au fur et à mesure, mais ça s'est normal puisque par défaut le flux des messages d'erreur est différent du flux standard).

Alors que si tu tapes ceci :

PS&gt; get-childitem c:\windows -rec | write-output

... tu commenceras à voir les résultats très rapidement, dès qu'ils sont émis par get-childitem.

Il y a également une différence notable dans l'utilisation de la mémoire. Dans le cas où tu passes (get-childitem) en paramètre, le contenu est chargé intégralement en mémoire pour pouvoir être passé en paramètre, alors que si tu passes le résultat de get-childitem via la pipeline, la mémoire n'est utilisée que comme zone tampon entre les deux commandes. Si tu as un grand nombre d'objets et/ou des objets très gourmands en mémoire, la différence peut être significative.

J'espère ne pas t'avoir trop confusionné avec ces précisions supplémentaires. :)

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

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