Question Pipeline et Get-Content (Résolu)

Plus d'informations
il y a 17 ans 3 mois #3338 par blanc
Bonjour,
Je ne comprends pas pourquoi je ne peux pas écrire :
\"c:\toto.txt\" | get-content
ou
\"c:\toto.txt\" | get-content $_
:sick:
Une matinée à essayer de comprendre. J'ai envi de ...de...bon, je me calme.

Merci d'avance.<br><br>Message édité par: Arnaud, à: 1/12/08 22:25

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

Plus d'informations
il y a 17 ans 3 mois #3339 par michault
Réponse de michault sur le sujet Re:pipeline et get-content
Bonjour,

Get-content \&quot;c:toto.txt\&quot;
ça marche très bien.

@+

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

Plus d'informations
il y a 17 ans 3 mois #3341 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:pipeline et get-content
Salut,
noel écrit:

Je ne comprends pas pourquoi je ne peux pas écrire :

Il faut étudier le binding d'argument, c'est à dire comment les cmdlet PowerShell lient les paramètres dans le pipeline.
Dans un premier temps vérifier le type de liaison par :

help Get-content -full

Nous indique que le paramètre path est lié par le nom de la propriété :

-Path [&lt;string[]&gt;]
Specifies the path to an item. Get-Content retrieves the content of the item. Wildcards are permitted. The para
meter name (\&quot;-Path\&quot; or \&quot;-FilePath\&quot;) is optional.

Required? true
Position? 1
Default value
Accept pipeline input? true (ByPropertyName)
Accept wildcard characters? false

donc
[code:1]
#nok
\&quot;c:toto.txt\&quot; | get-content $_
#nok, pas de propriéte attendu
\&quot;c:toto.txt\&quot; | get-content
#nok, la propriéte n'existe pas
1|select t|%{$_.t=\&quot;c:\boot.ini\&quot;;$_}|gc
#Ok, la propriéte existe, on peut la retrouver afin de la lier
1|select Path|%{$_.Path=\&quot;c:\boot.ini\&quot;;$_}|gc
[/code:1]
La suite :
keithhill.spaces.live.com/blog/cns!5A8D2641E0963A97!6130.entry

Voir aussi How Windows PowerShell Works . J'ai commencé la traduction de cette page je le mettrais en ligne prochainement...

Tutoriels PowerShell

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

Plus d'informations
il y a 17 ans 3 mois #3343 par blanc
Réponse de blanc sur le sujet Re:pipeline et get-content
Wouaoou ! ma retraite ne suffira pas. Je n'y suis pas encore. Certes.
1|select-object Path|%{$_.Path=\&quot;c:\boot.ini\&quot;;$_}|gc
Si je tente une \&quot;appropriation\&quot; :
soit l'objet string \&quot;1\&quot;, j'en prends la propriété \&quot;Path\&quot; et je construit un nouvel objet. Pour cet objet, je modifie sa propriété \&quot;path\&quot; et je le pose sur le pipeline pour le gc. Propriété reconnue!
get-item \&quot;c:\boot.ini\&quot; -force | gm
renvoie bien un TypeName: System.IO.FileInfo avec une propriété \&quot;name\&quot;. le gc marche.
Est-ce bien cette propriété qui est utilisée par get-content car je ne vois pas de \&quot;path\&quot;?
Mais alors pourquoi le gc ne marche pas avec
(get-item \&quot;c:\\&quot; -force).GetFiles(\&quot;boot.ini\&quot;)[0]
qui est du même type? Quoique, avec l'histoire du tableau plus que sibyllin...
Je crois toujours comprendre et le bout du tunnel recule.
Merci pour votre patience, M. Dardenne, et vote pédagogie.

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

Plus d'informations
il y a 17 ans 3 mois #3349 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:pipeline et get-content
noel écrit:

1|select-object Path|%{$_.Path=\&quot;c:\boot.ini\&quot;;$_}|gc
Si je tente une \&quot;appropriation\&quot; :
soit l'objet string \&quot;1\&quot;, j'en prends la propriété \&quot;Path\&quot; et je construit un nouvel objet.

Non ce n'est pas tout à fait ça, ici on construit un objet personnalisé, le \&quot;1\&quot; sert juste à utiliser le pipe avec Select, c'est plutôt :
\&quot;je construit un nouvel objet possédant une propriété \&quot;Path\&quot;
Select est ici détourné de son objectif, il faut savoir qu'il construit un second objet à partir d'un premier.
noel écrit:

Est-ce bien cette propriété qui est utilisée par get-content car je ne vois pas de \&quot;path\&quot;?

Je pense qu'il recherche la propriété path ou PSpath, là faut désassembler le code pour en être sûr.
noel écrit:

Mais alors pourquoi le gc ne marche pas avec
(get-item \&quot;c:\\&quot; -force).GetFiles(\&quot;boot.ini\&quot;)[0]
qui est du même type? Quoique, avec l'histoire du tableau plus que sibyllin...

Pour le tableau à prioris ce n'est pas nécessaire.
Ici ça ne fonctionne pas car tu accédes au FileSystem nativement,via .NET, et non plus par l'intermédiaire du provider de PS (Get-PSProvider FileSystem).
Dans ce cas les propriétés additionnelles ne sont pas ajoutées car tu ne passes pas par le système de type de PowerShell (ETS).
L'objet est tjr de la même classe(FileInfo), il est bien 'adapté'(PSObject:FileInfo) mais n'a pas été enrichi via ETS. Pour plus d'info .

Merci pour votre patience, M. Dardenne, et vote pédagogie.

De rien, si ça peut t'aider :-)

Tutoriels PowerShell

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

Plus d'informations
il y a 17 ans 3 mois #3351 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:pipeline et get-content
Pour info, la déclaration C# du paramètre Path :
ValueFromPipelineByPropertyName
[code:1]
[Parameter(Position=0, ParameterSetName=\&quot;Path\&quot;, Mandatory=true, ValueFromPipelineByPropertyName=true)]
public string[] Path
{
[/code:1]
et celle du paramètre LiteralPath du cmdlet Get-Content
[code:1]
Parameter(Position=0, ParameterSetName=\&quot;LiteralPath\&quot;, Mandatory=true, ValueFromPipeline=false, ValueFromPipelineByPropertyName=true), Alias(new string[] { \&quot;PSPath\&quot; })]
public string[] LiteralPath
{
[/code:1]
Pour ce dernier il a un alias nommé \&quot;PSPath\&quot; qui est le nom d'un membre additionnel d'un objet FileInfo enrichi par ETS.
Donc gc recherche les noms de propriété Path, LiteralPath et PSPath.

Tutoriels PowerShell

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

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