Question
Pipeline et Get-Content (Résolu)
- blanc
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 54
- Remerciements reçus 0
Je ne comprends pas pourquoi je ne peux pas écrire :
\"c:\toto.txt\" | get-content
ou
\"c:\toto.txt\" | get-content $_
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.
- michault
- Hors Ligne
- Membre premium
-
- Messages : 128
- Remerciements reçus 0
Get-content \"c:toto.txt\"
ça marche très bien.
@+
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
noel écrit:
Il faut étudier le binding d'argument, c'est à dire comment les cmdlet PowerShell lient les paramètres dans le pipeline.Je ne comprends pas pourquoi je ne peux pas écrire :
Dans un premier temps vérifier le type de liaison par :
Nous indique que le paramètre path est lié par le nom de la propriété :help Get-content -full
donc-Path [<string[]>]
Specifies the path to an item. Get-Content retrieves the content of the item. Wildcards are permitted. The para
meter name (\"-Path\" or \"-FilePath\") is optional.
Required? true
Position? 1
Default value
Accept pipeline input? true (ByPropertyName)
Accept wildcard characters? false
[code:1]
#nok
\"c:toto.txt\" | get-content $_
#nok, pas de propriéte attendu
\"c:toto.txt\" | get-content
#nok, la propriéte n'existe pas
1|select t|%{$_.t=\"c:\boot.ini\";$_}|gc
#Ok, la propriéte existe, on peut la retrouver afin de la lier
1|select Path|%{$_.Path=\"c:\boot.ini\";$_}|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.
- blanc
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 54
- Remerciements reçus 0
1|select-object Path|%{$_.Path=\"c:\boot.ini\";$_}|gc
Si je tente une \"appropriation\" :
soit l'objet string \"1\", j'en prends la propriété \"Path\" et je construit un nouvel objet. Pour cet objet, je modifie sa propriété \"path\" et je le pose sur le pipeline pour le gc. Propriété reconnue!
get-item \"c:\boot.ini\" -force | gm
renvoie bien un TypeName: System.IO.FileInfo avec une propriété \"name\". le gc marche.
Est-ce bien cette propriété qui est utilisée par get-content car je ne vois pas de \"path\"?
Mais alors pourquoi le gc ne marche pas avec
(get-item \"c:\\" -force).GetFiles(\"boot.ini\")[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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Non ce n'est pas tout à fait ça, ici on construit un objet personnalisé, le \"1\" sert juste à utiliser le pipe avec Select, c'est plutôt :1|select-object Path|%{$_.Path=\"c:\boot.ini\";$_}|gc
Si je tente une \"appropriation\" :
soit l'objet string \"1\", j'en prends la propriété \"Path\" et je construit un nouvel objet.
\"je construit un nouvel objet possédant une propriété \"Path\"
Select est ici détourné de son objectif, il faut savoir qu'il construit un second objet à partir d'un premier.
noel écrit:
Je pense qu'il recherche la propriété path ou PSpath, là faut désassembler le code pour en être sûr.Est-ce bien cette propriété qui est utilisée par get-content car je ne vois pas de \"path\"?
noel écrit:
Pour le tableau à prioris ce n'est pas nécessaire.Mais alors pourquoi le gc ne marche pas avec
(get-item \"c:\\" -force).GetFiles(\"boot.ini\")[0]
qui est du même type? Quoique, avec l'histoire du tableau plus que sibyllin...
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 .
De rien, si ça peut t'aiderMerci pour votre patience, M. Dardenne, et vote pédagogie.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
ValueFromPipelineByPropertyName
[code:1]
[Parameter(Position=0, ParameterSetName=\"Path\", 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=\"LiteralPath\", Mandatory=true, ValueFromPipeline=false, ValueFromPipelineByPropertyName=true), Alias(new string[] { \"PSPath\" })]
public string[] LiteralPath
{
[/code:1]
Pour ce dernier il a un alias nommé \"PSPath\" 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.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Pipeline et Get-Content (Résolu)