Vous êtes sur la page 1sur 9

RUBRIQUE

about_pipelines
DESCRIPTION COURTE
Combinaison de commandes en pipelines dans Windows PowerShell
DESCRIPTION LONGUE
Un pipeline est une srie de commandes connectes par des
oprateurs de pipeline (|) (ASCII 124). Chaque oprateur de
pipeline envoie les rsultats de la commande prcdente la
commande suivante.

Vous pouvez utiliser des pipelines pour envoyer les objets
gnrs par une commande une autre commande qui les utilisera
comme entre traiter. De mme, vous pouvez envoyer la sortie de
cette commande une autre commande encore. Il en rsulte une
chane de commandes trs puissante ou " pipeline " comprenant une
srie de commandes simples.
Par exemple :
Command-1 | Command-2 | Command-3
Dans cet exemple, les objets mis par Command-1 sont envoys
Command-2. Command-2 les traite et les envoie Command-3.
Command-3 les traite et les envoie vers la suite du pipeline.
tant donn qu'il n'y a plus de commande dans le pipeline,
les rsultats s'affichent sur la console.
Dans un pipeline, les commandes sont traites de gauche droite,
dans l'ordre dans lequel elles apparaissent. Le traitement est
men comme une opration unique et la sortie est affiche ds
qu'elle est gnre.
Voici un exemple simple. La commande suivante obtient le
processus Notepad (Bloc-notes), puis l'arrte.
get-process notepad | stop-process
La premire commande utilise l'applet de commande Get-Process
pour obtenir un objet reprsentant le processus Notepad. Elle
utilise un oprateur de pipeline (|) pour envoyer l'objet
processus l'applet de commande Stop-Process, qui arrte le
processus Notepad. Remarquez que la commande Stop-Process ne
comporte aucun paramtre Name ou ID pour spcifier le processus
car le processus spcifi est envoy travers le pipeline.
Voici un exemple pratique. Ce pipeline de commandes obtient les
fichiers texte du rpertoire actif, slectionne uniquement les
fichiers de plus de 10 000 octets de long, les trie par longueur,
puis affiche le nom et la longueur de chaque fichier dans une table.
Get-ChildItem -path *.txt | Where-Object {$_.length -gt 10000} |
Sort-Object -property Length | Format-Table -property name, length
Ce pipeline comporte quatre commandes dans l'ordre spcifi.
La commande est crite horizontalement, mais nous afficherons
le processus verticalement dans le graphique suivant.
Get-ChildItem -path *.txt
|
| (FileInfo objects )
| ( .txt )
|
V
Where-Object {$_.length -gt 10000}
|
| (FileInfo objects )
| ( .txt )
| ( Length > 10000 )
|
V
Sort-Object -property Length
|
| (FileInfo objects )
| ( .txt )
| ( Length > 10000 )
| ( Sorted by length )
|
V
Format-Table -property name, length
|
| (FileInfo objects )
| ( .txt )
| ( Length > 10000 )
| ( Sorted by length )
| (Formatted in a table )
|
V
Name Length
---- ------
tmp1.txt 82920
tmp2.txt 114000
tmp3.txt 114000
UTILISATION DE PIPELINES
Les applets de commande Windows PowerShell ont t conues pour
tre utilises dans des pipelines. Par exemple, vous pouvez
gnralement rediriger les rsultats d'une applet de commande
Get vers une applet de commande d'action (telle que Set, Start,
Stop ou Rename) pour le mme nom.
Par exemple, vous pouvez rediriger tout service de l'applet de
commande Get-Service vers l'applet de commande Start-Service ou
Stop-Service (toutefois, les services dsactivs ne peuvent pas
tre redmarrs de cette faon).
Ce pipeline de commandes dmarre le service WMI sur l'ordinateur
local :
get-service wmi | start-service
Les applets de commande qui obtiennent et dfinissent des objets
des fournisseurs Windows PowerShell, telles que les applets de
commande Item et ItemProperty, sont galement conues pour tre
utilises dans des pipelines.
Par exemple, vous pouvez rediriger les rsultats d'une commande
Get-Item ou Get-ChildItem du fournisseur de Registre Windows
PowerShell vers l'applet de commande New-ItemProperty. Cette
commande ajoute une nouvelle entre de Registre, NoOfEmployees,
avec la valeur 8124 la cl de Registre MyCompany.
get-item -path HKLM:\Software\MyCompany | new-Itemproperty -name NoOfEmpl
oyees -value 8124
Bon nombre des applets de commande utilitaires, telles que Get-Member,
Where-Object, Sort-Object, Group-Object et Measure-Object sont utilises
presque exclusivement dans des pipelines. Vous pouvez rediriger tout
type d'objet vers ces applets de commande.
Par exemple, vous pouvez rediriger tous les processus de
l'ordinateur vers la commande Sort-Object pour qu'ils soient
tris selon le nombre de handles qu'ils contiennent.
get-process | sort-object -property handles

De mme, vous pouvez rediriger tout type d'objet vers les applets
de commande de mise en forme, telles que Format-List et
Format-Table, les applets de commande Export, telles que
Export-Clixml et Export-CSV, et les applets de commande Out,
telles qu'Out-Printer.
Par exemple, vous pouvez rediriger le processus Winlogon vers
l'applet de commande Format-List pour afficher toutes les
proprits du processus dans une liste.
get-process winlogon | format-list -property *
Avec un peu de pratique, vous vous apercevrez que le fait de
combiner des commandes simples dans des pipelines est un rel
gain de temps et rend l'criture de scripts plus efficace.
FONCTIONNEMENT DES PIPELINES
Lorsque vous redirigez des objets, c'est--dire lorsque vous les
envoyez de la sortie d'une commande vers une autre commande,
Windows PowerShell essaie de les associer l'un des paramtres
de l'applet de commande destinataire.
Pour cela, le composant de liaison des paramtres de Windows
PowerShell, qui associe des objets d'entre aux paramtres
d'applet de commande, essaie de trouver un paramtre remplissant
les critres suivants :

-- Le paramtre doit accepter l'entre provenant d'un pipeline
(tous ne l'acceptent pas).
-- Le paramtre doit accepter le type d'objet envoy ou un type
d'objet vers lequel l'objet peut tre converti.
-- Le paramtre ne doit pas dj tre utilis dans la commande.
Par exemple, l'applet de commande Start-Service comporte de
nombreux paramtres, mais seuls deux d'entre eux, Name et
InputObject, acceptent l'entre du pipeline. Le paramtre Name
accepte des chanes et le paramtre InputObject accepte des
objets services. Par consquent, vous pouvez rediriger des
chanes et des objets services (ainsi que des objets avec des
proprits pouvant tre converties en chane et objets services)
vers Start-Service.
Si le composant de liaison des paramtres de Windows PowerShell
ne peut pas associer les objets redirigs un paramtre de
l'applet de commande destinataire, la commande choue et Windows
PowerShell vous invite fournir les valeurs de paramtre manquantes.
Vous ne pouvez pas forcer le composant de liaison des paramtres
associer des objets redirigs un paramtre particulier. Vous
ne pouvez mme pas suggrer un paramtre. C'est en effet la
logique du composant qui gre la redirection aussi efficacement
que possible.
TRAITEMENT INDIVIDUEL
La redirection d'objets vers une commande est similaire
l'utilisation d'un paramtre de la commande pour l'envoi des objets.
Par exemple, la redirection d'objets reprsentant les services
de l'ordinateur vers une commande Format-Table, comme suit :
get-service | format-table -property name, dependentservices
est similaire la procdure consistant enregistrer des objets
services dans une variable et utiliser le paramtre InputObject
de Format-Table pour les envoyer
$services = get-service
format-table -inputobject $services -property name, dependents
ervices
ou l'incorporation de la commande dans la valeur de paramtre.
format-table -inputobject (get-service wmi) -property name, de
pendentservices
Toutefois, il y a une diffrence importante. Lorsque vous redirigez
plusieurs objets vers une commande, Windows PowerShell les envoie
un par un. Lorsque vous utilisez un paramtre de commande, les
objets sont envoys comme un objet tableau unique.
Cette diffrence apparemment technique peut avoir d'intressantes,
et parfois utiles, consquences.
Par exemple, si vous redirigez plusieurs objets processus de
l'applet de commande Get-Process vers l'applet de commande
Get-Member, Windows PowerShell envoie chaque objet processus,
un par un, Get-Member. Get-Member affiche la classe (type)
.NET des objets processus et leurs proprits et mthodes.
(Get-Member supprime les doublons, donc si les objets sont tous
du mme type, il affiche un seul type d'objet.)
Dans ce cas, Get-Member affiche les proprits et mthodes de chaque
objet processus, autrement dit, un objet System.Diagnostics.Process.
get-process | get-member
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
Handles AliasProperty Handles = Handlec
ount
Name AliasProperty Name = ProcessNam
e
NPM AliasProperty NPM = NonpagedSys
temMemorySize
...
Toutefois, si vous utilisez le paramtre InputObject de
Get-Member, Get-Member reoit un tableau d'objets
System.Diagnostics.Process comme seule unit et affiche les
proprits d'un tableau d'objets. (Remarquez le symbole de
tableau ([]) aprs le nom de type System.Object.)
get-member -inputobject (get-process)
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
Address Method System.Object & Address(Int32 )
Clone Method System.Object Clone()
...
Ce rsultat peut ne pas tre ce que vous attendiez, mais lorsque
vous l'aurez compris, vous pourrez l'utiliser. Par exemple, un
tableau d'objets processus comporte une proprit Count que vous
pouvez utiliser pour compter le nombre de processus sur l'ordinateur.
(get-process).count

Cette distinction peut avoir son importance. Aussi,
rappelez-vous que lorsque vous redirigez des objets
vers une applet de commande, ils sont remis un par un.
ACCEPTE L'ENTRE DE PIPELINE
Pour recevoir des objets provenant d'un pipeline, l'applet de commande
destinataire doit avoir un paramtre qui accepte l'entre de
pipeline. Vous pouvez utiliser une commande Get-Help avec les
paramtres Full ou Parameter pour dterminer lequel, le cas chant,
des paramtres d'une applet de commande accepte l'entre de pipeline.
Dans l'affichage par dfaut de Get-Help, l'lment "Accepts
pipeline input" (" Accepte l'entre de pipeline ") apparat dans
une table d'attributs de paramtre. Cette table s'affiche
uniquement lorsque vous utilisez les paramtres Full ou Parameter
de l'applet de commande Get-Help.
Par exemple, pour dterminer lequel des paramtres de l'applet
de commande Start-Service accepte l'entre de pipeline, tapez :

get-help start-service -full
get-help start-service -parameter *
Par exemple, l'aide sur l'applet de commande Start-Service indique
que les paramtres Name et InputObject acceptent l'entre de pipeline
("true", " vrai "). Tous les autres paramtres ont une valeur "false"
(" faux ") pour la ligne "Accept pipeline input?"
(" Accepter l'entre de pipeline ? ").
-name <string[]>
Spcifie le nom de service du service dmarrer.
Le nom de paramtre est facultatif. Vous pouvez utiliser
" -Name " ou son alias, " -ServiceName ", ou encore
omettre le nom de paramtre.
Obligatoire ? true
Position ? 1
Valeur par dfaut
--> Accepter l'entre de pipeline ? true (ByValue, ByPropertyName)
Accepter les caractres gnriques ? true
-inputObject <ServiceController[]>
Spcifie les objets ServiceController reprsentant les
services dmarrer. Entrez une variable contenant les
objets ou tapez une commande ou une expression qui obtient
les objets.
Obligatoire ? false
Position ? named
Valeur par dfaut
--> Accepter l'entre de pipeline ? true (ByValue)
Accepter les caractres gnriques ? false
Cela signifie que vous pouvez envoyer des objets (PsObject)
travers le pipeline l'applet de commande Where-Object et que
Windows PowerShell associera l'objet au paramtre InputObject.
MTHODES D'ACCEPTATION DE L'ENTRE DE PIPELINE
Les paramtres d'applet de commande peuvent accepter l'entre de
pipeline de l'une des deux faons suivantes :
-- Par valeur (ByValue) : les paramtres qui acceptent l'entre
" par valeur " peuvent accepter des objets redirigs qui ont
le mme type .NET que leur valeur de paramtre ou des objets
pouvant tre convertis en ce type.
Par exemple, le paramtre Name de Start-Service accepte
l'entre de pipeline par valeur. Il peut accepter des objets
chanes ou des objets pouvant tre convertis en chanes.
-- Par nom de proprit (ByPropertyName) : les paramtres qui
acceptent l'entre " par nom de proprit " peuvent accepter
des objets redirigs uniquement lorsqu'une proprit de
l'objet porte le mme nom que le paramtre.
Par exemple, le paramtre Name de Start-Service peut accepter
des objets ayant une proprit Name.
(Pour rpertorier les proprits d'un objet, redirigez-le
vers Get-Member.)
Certains paramtres peuvent accepter des objets par valeur ou
par nom de proprit. Ces paramtres sont conus pour accepter
facilement l'entre de pipeline.
EXAMEN DES ERREURS DE PIPELINE
Si une commande choue cause d'une erreur de pipeline,
vous pouvez examiner cette dernire et la rcrire.
Par exemple, la commande suivante essaie de dplacer une entre
du Registre d'une cl de Registre vers une autre en utilisant
l'applet de commande Get-Item pour obtenir le chemin de destination,
puis rediriger le chemin d'accs vers l'applet de commande
Move-ItemProperty.
La commande utilise, en particulier, l'applet de commande
Get-Item pour obtenir le chemin de destination. Elle utilise un
oprateur de pipeline pour envoyer le rsultat l'applet de
commande Move-ItemProperty. La commande Move-ItemProperty
spcifie le chemin d'accs actif et le nom de l'entre du
Registre dplacer.
get-item -path hklm:\software\mycompany\sales |
move-itemproperty -path hklm:\software\mycompany\design -name product
La commande choue et Windows PowerShell affiche le message
d'erreur suivant :
Move-ItemProperty : l'objet d'entre ne peut tre li
aucun paramtre de la commande, soit parce que cette
commande n'accepte pas l'entre de pipeline, soit parce que
l'entre et ses proprits ne correspondent aucun des
paramtres qui acceptent l'entre de pipeline.
la ligne : 1 Caractre : 23
+ $a | move-itemproperty <<<< -path hklm:\software\mycompany\design -na
me product
Pour examiner la raison de l'chec, utilisez l'applet de commande
Trace-Command pour tracer le composant de liaison des paramtres
de Windows PowerShell. La commande suivante trace le composant de
liaison des paramtres pendant que la commande procde au
traitement. Elle utilise le paramtre -pshost pour afficher les
rsultats sur la console et la commande -filepath pour les
envoyer vers le fichier debug.txt pour rfrence ultrieure.
trace-command -name parameterbinding -expression {get-item -path
hklm:\software\mycompany\sales | move-itemproperty -path
hklm:\software\mycompany\design -name product} -pshost -filepath debug.
txt
Les rsultats de la trace sont longs, mais ils indiquent les
valeurs lies l'applet de commande Get-Item, puis les valeurs
nommes lies l'applet de commande Move-ItemProperty.
...
BIND NAMED cmd line args [Move-ItemProperty]
BIND arg [hklm:\software\mycompany\design] to parameter [Chemin d'ac
cs]
...
BIND arg [produit] to parameter [Nom]
....
BIND POSITIONAL cmd line args [Move-ItemProperty]
...
Au final, cela montre que la tentative de liaison du chemin
d'accs au paramtre Destination de Move-ItemProperty a chou.
...
BIND PIPELINE object to parameters: [Move-ItemProperty]
PIPELINE object TYPE = [Microsoft.Win32.RegistryKey]
RESTORING pipeline parameter's original values
Parameter [Destination] PIPELINE INPUT ValueFromPipelineByPropertyNa
me NO COERCION
Parameter [Informations d'identification] PIPELINE INPUT ValueFromPi
pelineByPropertyName NO COERCION
...
Pour examiner la raison de l'chec, utilisez l'applet de
commande Get-Help pour afficher les attributs du paramtre
Destination. La commande suivante obtient des informations
dtailles sur le paramtre Destination.
get-help move-itemproperty -parameter destination
Les rsultats indiquent que le paramtre Destination accepte
uniquement l'entre de pipeline " par nom de proprit ".
Autrement dit, l'objet redirig doit avoir une proprit nomme
Destination.
-destination <chane>
Spcifie le chemin d'accs l'emplacement de destination.
Obligatoire ? true
Position ? 2
Valeur par dfaut
Accepter l'entre de pipeline ? true (ByPropertyName)
Accepter les caractres gnriques ? true
Pour afficher les proprits de l'objet redirig vers l'applet
de commande Move-ItemProperty, redirigez-le vers l'applet de
commande Get-Member. La commande suivante redirige les rsultats
de la premire partie de la commande vers l'applet de commande
Get-Member.
get-item -path hklm:\software\mycompany\sales | get-member
La sortie indique que l'lment est un objet Microsoft.Win32.Regi
stryKey sans proprit Destination. Cela explique pourquoi la
commande a chou.
Pour rsoudre la commande, nous devons spcifier la destination
dans l'applet de commande Move-ItemProperty. Nous pouvons
utiliser une commande Get-ItemProperty pour obtenir le chemin
d'accs, mais le nom et la destination doivent tre spcifis
dans la partie Move-ItemProperty de la commande.

get-item -path hklm:\software\mycompany\design |
move-itemproperty -dest hklm:\software\mycompany\design -name product
Pour vrifier que la commande a fonctionn, utilisez une commande Get-ItemPrope
rty :
get-itemproperty hklm:\software\mycompany\sales
Les rsultats indiquent que l'entre du Registre Product a t
dplace vers la cl Sales.
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\so
ftware\mycompany\sales
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\so
ftware\mycompany
PSChildName : sales
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
Product : 18
VOIR AUSSI

about_objects
about_parameters
about_command_syntax
about_foreach