Introduction À PowerShell
Introduction À PowerShell
Monad)
Cet article vous propose de découvrir PowerShell, nom de code Monad, qui
est le futur Shell de Microsoft Windows. Les concepts de base présentés ici
sont stabilisés mais il se peut que certains détails d'implémentation ou de
syntaxe différent dans la release 1.0.
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
1 - Public concerné
1-1 - Les pré-requis
1-2 - Les sources
1-3 - Détails de la documentation US de PowerShell RC1
1-3-1 - Documentation associée
1-4 - Obtenir de l'aide.
2 - PowerShell qu'est-ce que c'est ?
3 - Le socle technique
3-1 - Qu'est-ce qu'un Cmdlet
3-1-1 - Les paramètres
3-2 - Principe de nommage des Cmdlet
3-2-1 - Substantif (Nom)
3-2-2 - Verbe
3-3 - Les providers
3-3-1 - ObjectSpace
3-4 - Le pipelinening
3-5 - PowerShell et WMI
3-6 - L'affichage sur la console
4 - Les alias
5 - Les objets COM sous PowerShell
6 - Format de données
7 - L'extension de type (ETS)
8 - Intégration d'un nouveau Cmdlet
9 - Configuration de la sécurité
10 - La notion de 'globbing'
11 - Raccourcis clavier
12 - Liens
-2-
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
1 - Public concerné
Testé avec Monad beta3 et PowerShell RC1, le framework .NET 2.0 et Microsoft Visual Studio 2005
C# Express.
Version 1.0
Des connaissances de base sur la programmation orienté objet sous .NET faciliterons la
compréhension de cette article.
-3-
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
Il va sans dire que la lecture de ces documents facilite grandement la compréhension du nouveau
Shell et du langage de script associé.
Note : Jusqu'à la beta 3 le nom du shell était Microsoft Shell, finalement il se nomme PowerShell.
Vous trouverez encore de nombreux liens sous l'appellation Monad ou MSH, notamment dans le SDK.
-4-
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
PowerShell est un langage de script et un shell interactif offrant une manière de traiter des tâches
orientée commande. Les concepteurs ont suivis différentes approches afin que PowerShell soit :
PowerShell est compatible avec les précédents langage de scripting. En règle générale, MSH exécute
toutes les commandes et scripts existant. MSH n'interprète pas les fichier .bat ou .cmd, il les dirige
vers cmd.exe pour les exécuter.
PowerShell facilitera les tâches d'administration telle que la gestion du paramètrage des composants
système imprimante, réseaux, IE, la création de compte utilisateurs et les opérations associées...
Suite aux problémes liés à la sécurité mis en évidence dans la Beta 1, PowerShell se base sur
différents niveaux d'autorisation d'exécution. Par exemple avec le niveau AllSigned, seul les scripts
disposant d'une signature autorisée s'exécuteront.
Rien de bien nouveau, me direz-vous par rapport aux solutions existante (Batch,VBScript,Cygwin...).
Nous allons voir ça un peu plus dans le détail, ce qui vous permettra de vous faire une opinion.
-5-
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
3 - Le socle technique
PowerShell s'appuie sur la plateforme .NET plus particuliérement sur le framework 2.0, ce qui signifie
que tout est objet sous PowerShell (aussi nommé PS).
Bien que MSH.exe soit un programme win32 il est plus proche d'un loader du runtime .NET, vous
pouvez utiliser le debugger fournis avec .NET 2.0 pour confirmer que MSH.exe est bien une
application gérée.
Déclarons une variable contenant une chaine de caractères, puis affichons son contenu, son type et
enfin le nom du type :
Ici Gettype est une méthode la classe .NET System.Object. On voit qu'il n'est pas nécessaire de
déclarer le type de la variable pour l'utiliser ni d'appeler un constructeur pour l'initialiser, le shell se
charge de ces opérations afin de nous faciliter l'écriture. Mais il est tout à fait possible d'expliciter ces
opérations comme nous le verrons plus loin.
Sans rien déclarer, à part notre variable, nous accédons directement à la richesse du framework.
Toutes les classes accessibles sous .NET le sont donc sous MSH, sous réserve de les charger. Le
langage de script ne permet pas de définir de nouvelles classes mais permet d'enrichir une instance
avec le système d'extension de type (ETS) qui n'a rien à voir avec les Extension Methods du C#3.0.
Essayons de créer une Fenêtre en appelant son constructeur par l'intermédiaire de la commande
New-Object :
Cette instruction provoque une erreur car la classe utilisée n'est pas encore accessible, on doit donc
auparavant charger l'assembly l'hébergeant :
-6-
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
Un autre aspect important concerne la manipulation des collections d'objets qui ici se fait simplement.
Par exemple la commande Get-process renvoi la liste des process en cours d'exécution :
C'est le point le plus important sous PowerShell, les commandes (plus particulièrement les cmdlet)
manipulent et renvoi des instances de classes .NET. Dans une certaine mesure il n'est plus
nécessaire de spécialiser les commandes puisque l'on accéde à l'ensemble des informations
disponible de l'objet manipulé.
Ainsi traditionnellement dans un script, on appellait un premier programme pour récupérer le numéro
de process d'une application puis un second programme pour la supprimer. Ici sous MSH la méthode
Kill de la classe System.Diagnostics.Process est accessible directement.
-7-
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
-8-
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
• Script/Parser : Traite les constructions du langage tels que les scripts, les prédicats, les
conditions, etc.
• Pipeline Processor : Gére les communications entre les cmdlet via des pipes.
• Command Processor : Gére l'exécution des cmdlets, l'enregistrement et les metadonnées
associées.
• Session State : Gére les ensembles de données utilisés par un cmdlet lors de son exécution.
• Error et Event Handler : Gére les exceptions et les événements.
• Extended Type System : Fournit une interface commune d'accés aux propriétés, méthodes, etc
indépendante du type d'objet sous-jacent.
Un Cmdlet est une petite unité fonctionnelle ou tout simplement une commande comme en
contiennent d'autres types de shell. Les Cmdlets diffèrent des commandes des autres environnements
de scripting sur de nombreux points :
Un Cmdlet est donc du code managé et son implémentation doit respecter certains points comme par
exemple :
Les Cmdlets peuvent être réalisés avec n'importe quel langage .NET ou à l'aide du langage de script
MSH. Utilisez Get-Command pour afficher les cmdlets disponibles.
Les arguments d'un Cmdlet peuvent être indiqués de différentes manières. Voyons cela avec le
Cmdlet get-command, qui fournit des informations au sujet des divers Cmdlets disponibles. Sa
signature est :
Dans ce cas-ci et parce que -Name est le premier paramètre, vous pouvez omettre la désignation de
paramètre (-Name) et indiquer seulement la valeur :
Si vous indiquez une série de valeurs sans désigner explicitement les paramètres, MSH associera
automatiquement les valeurs aux désignations appropriées basées sur l'ordre par défaut des
paramètres indiqués par la signature de commande, ainsi si vous entrez ce qui suit :
msh> get-command A B C
-9-
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
MSH supposera que A est le paramètre -Name, B est le paramètre -Type, et C le paramètre -Verb. Si
vous voulez employer les paramètres dans le désordre ou si vous souhaitez omettre des paramètres,
vous pouvez indiquer la désignation de paramètre ainsi la valeur :
La définition d'un paramétre d'une 'classe cmdlet' se fait par l'intermédiaire d'un attribut placé sur un
membre :
[Parameter(Mandatory=true, Position=0)]
public string[] FullName
- 10 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
Un Cmdlet s'appuie sur le modéle objet de .NET pour sa construction et sur le modéle
verbe-susbstantif pour sa régle de nommage.
Toutes les commandes doivent être bien formé, un nom correcte se compose d'un verbe et d'un nom
sous la forme : verbe-nom.
Notez l'utilisation du caractère "-" pour séparer le verbe d'action du nom de la ressource concernée.
L'idée est que chaque nom sera employé pour opérer sur une certaine partie spécifique du système.
Par exemple le nom Drive permet de désigner les divers lecteurs du système.
Les opérations, ou les actions, sont définies par les verbes. Par exemple nous pourrions créer un
lecteur ou retirer un lecteur existant, la syntaxe serait respectivement New-Drive et Remove-Drive.
On utilisera la commande Get-help ou Get-Command (-Noun -Verb) pour retrouver les noms et
verbes recencés :
MSH C:\Temp> get-help object # Retrouve les noms de commande comportant le mot Object
Name Category Synopsis
---- -------- --------
foreach-object Command Applies script blocks to each object...
where-object Command This Cmdlet filters the input from t...
compare-object Command Compares the properties of objects.
measure-object Command Measures various aspects of objects ...
tee-object Command Sends input objects to two places.
new-object Command [-TypeName] type-name
select-object Command Selects objects based on parameters ...
group-object Command Groups the objects that contain the ...
sort-object Command Sorts the input objects by property ...
write-object Command Writes an object to the pipeline
MSH C:\Temp> get-commande -Verb new # Retrouve les noms de commande comportant le verbe New
- 11 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
Les noms représentent des ressources du système, ils identifient donc le type d'objet sur lequel on
opére.
Pour nommer un cmdlet choisissez des noms de substantif spécifiques et évitez l'utilisation de noms
génériques car MSH emploiera ces derniers pour fournir des commandes opérant sur un large
éventail de ressources.
Le mieux est d'employer un nom singulier. Il est aussi recommandé de préfixer un nom générique, par
exemple Server, avec une version raccourcie du nom du produit. Par exemple Get-SQLServer.
• Alias
• Children
• Command
• Content
• Drive
• History
• Item
• Location
• Object
• Property
• PropertyValue
• Provider
• RunSpace
• Variable
3-2-2 - Verbe
Choisissez un verbe dans la liste de verbes standard du SDK et évitez de dévier de cette liste. Les
concepteurs ont souhaités pouvoir effectuer 80 à 90% des opérations sur le système en utilisant
moins de 50 verbes. Ceci permet aux administrateurs d'apprendre ces 50 verbes et de deviner
rapidement quelles combinaisons utiliser lorsqu'il rencontrent un nouvel objet.
Considérons l'exemple où un utilisateur souhaite arrêter une partie du système : Processus, services,
WebServices, job de sauvegarde, etc.
Choisissons de normaliser les commandes autour du verbe Stop. Les commandes seraient donc
Stop-Process, Stop-Service, Stop-WebService, Stop-BackupJob, etc
- 12 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
Notez que la volonté de tout contrôler avec moins de 50 verbes necéssite quelques décisions
difficiles. Kill est traditionnellement le verbe pour supprimer un processus, Cancel posséde une
nuance qui est différente de l'arrêt (Stop), Terminate pourrait être plus appropriée pour certaines
parties du système. Tout ces considérations jouent un rôle important si on regarde juste un nom
simple mais il faut passer outre pour offrir un système d'administration cohérent.
Les paramètres peuvent être utilisés pour préciser le sens d'un verbe. Par exemple
Stop-WebService #Drain pourrait être employé pour indiquer que des opérations doivent être
accomplies sur certains éléments avant d'arrêter le service (la création d'une nouvelle commande
comme Drain-WebServices n'est pas nécessaire).
Les verbes ont été regroupés par paire pour faciliter leur mémorisation, par exemple Start est associé
à Stop, Get à Set...
L'utilisation de ces verbes lors de la création d'un cmdlet permettra aux utilisateurs de déduire qu'un
Cmdlet supportant Start proposera probablemant Stop et peut-être d'autres verbes de ces ensembles.
Notez que dans la plupart des cas un nom emploiera des verbes de plus d'un ensemble. En même
temps la plupart des noms n'emploieront pas tous les verbes d'un ensemble.
Suite aux retour des beta-testeurs l'équipe du projet Monad à fait en sorte que les développeurs
utilisant des verbes non standard soient forcés d'ajouter "__" au début du nom de cmdlet afin de
rendre leur cmdlet utilisable.
PowerShell vous offre la possibilité d'employer un ensemble cohérent de Cmdlets pour parcourir et
naviguer sur différents types de structure de données tels que le système de fichier, la base de
registre, Active Directory ou WMI.
Par exemple, vous pouvez employer la même commande pour lister les dossiers d'un répertoire ou
énumérer le contenu d'une clef de la base de registre.
- 13 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
Les providers du shell sont des interfaces logicielles qui présentent le contenu des différentes
structures de données dans un format cohérent.
Un provider du shell n'est pas lui-même la structure de donnée, mais une manière d'accéder aux
structures de données au travers des Cmdlets du noyau.
Quand un provider rend disponible des structures de données, il le fait en créant un ou plusieurs
lecteurs (drive) qui semblent contenir toutes ou certaines données stockées.
Par exemple, dans le cas du provider du système de fichier, il crée un lecteur pour chaque disque de
votre système. En conséquence, si vous avez un lecteur C et un lecteur D, le provider du système de
fichier créera des lecteur MSH appelées C et D. En fait, toutes les fois qu'un nouveau lecteur est
créée par Windows, y compris un lecteur partagé sur un serveur, le provider du système de fichier
crée un lecteur MSH avec le même nom.
Pour visualiser tous les lecteurs disponibles actuellement dans MSH, utilisez la commande suivante :
Vous pouvez visualiser les Cmdlets du noyau par la commande get-help about_Core_Commands.
- 14 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
hosting application
Image issue du SDK de PowerShell.
Note :
Il est tout à fait possible d'appeler des script ou des cmdlet dans vos applications (pour plus de
détails).
3-3-1 - ObjectSpace
Un espace d'objet est un ensemble d'objets organisés en hiérarchie. Cette hiérarchie est appellée un
Drive.
La hiérarchie est composée d'un ensemble de position identifiés par des chaînes de caractère
appellées Path.
Il peut y avoir à chaque position un ou plusieurs des éléments suivants : Children, Item, Property,
Content, Permission, Relation.
Ce modèle ne normalise, pour aucun de ces éléments, la syntaxe d'un chemin ou des structures de
données. Les propriétés et le contenue d'une position dans la base de registre sont très différentes de
celle d'un système de fichier ou d'un document XML ou encore d'un chemin Active Directory.
- 15 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
3-4 - Le pipelinening
PowerShell favorise l'interaction avec les données du système qui sont sous forme de données
structurées ou d'objets. On peut, en ligne de commande, référencer les propriétés de ces objets en
utilisant leurs noms plutôt que d'indiquer des colonnes et des lignes. Il en résulte un shell qui est
nettement plus simple à employer parce qu'il permet à l'utilisateur de se concentrer sur ce qu'il veut
réaliser au lieu de la façon dont il doit les réaliser.
C'est cette derniére approche que l'on trouve avec les batchs existant, voici un exemple (sous
NT-W2K) pour récupérer la date système dans une variable :
echo off
rem Insére la date système dans une variable
De plus, MSH "ne lie pas" l'acquisition de données avec la manipulation et l'affichage de données.
PowerShell est construit de telle manière que les données transitent d'une commande à une autre
sans être transformées au format texte. C'est seulement quand le texte est nécessaire qu'une
conversion de l'objet est faite.
Par exemple, si nous voulions une liste de tous les processus dont le nombre de handle est plus
grand que 400, nous exécuterions ce qui suit :
Dans cet exemple, le Cmdlet Get-Process passe des objets au Cmdlet Where-Object qui sélectionne
les objets qui ont une propriété appelée handlecount et d'une valeur supérieure à 400. Le Cmdlet
Where-Object envoie alors ces objets au Cmdlet Format-List qui les affiche.
La suite de caractères $_ représente l'instance de l'objet courant renvoyé par le pipe. MSH propose
nombreuses variables spéciales, voir le chapitre Special Variables du document intitulé
GettingStarted.rtf.
- 16 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
Un pipeline spéciale est disponible pour remonter les erreurs qui peuvent être bloquantes ou pas,
dans ce dernier cas le traitement se poursuit après l'affichage d'un message d'erreur. Le Cmdlet
Write-Error écrit sur ce pipeline d'erreur.
L'accés à WMI est aussi simple que sous VBScript/WSH. PowerShell s'appuie sur le référentiel WMI
afin d'accéder au ressources physique sans avoir à recoder tous les traitements plus ou moins
fastidieux au travers d'API .NET.
Par exemple pour afficher l'espace libre disponible sur un disque on utilisera la commande
Get-WmiObject sur la classe win32_logicaldisk :
De nombreux Shell utilise l'instruction Echo pour écrire du texte vers un pipe, sur la console, etc.
MSH adopte une approche légèrement différente en différenciant le pipe et la console. Le résultat
n'est pas convertie en texte tant qu'il n'est pas destiné à l'utilisateur. Le Cmdlet Write-Host est
équivalent à la commande UNIX Echo ... > /dev/tty.
Si vous voulez écrire un objet dans un pipe, vous pouvez soit employer la commande Write-Host, soit
employer l'objet lui-même. MSH enverra automatiquement cet objet dans le pipe.
- 17 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
4 - Les alias
Un alias est un raccourcis d'un cmdlet ou d'un exécutable mais sans ces paramètres (dans la beta 3
tout du moins). Il peuvent faciliter l'accés à un exécutable ou associer un terme plus explicite à un
cmdlet. Par exemple la commande DIR est un alias du cmdlet Get-ChildItem.
La commande Alias permet de retrouver la liste des alias déclarés. Utilisez Help Alias pour afficher
les commandes de manipulation d'alias.
- 18 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
Les objets COM peuvent être instanciés par la commande new-object en précisanr le paramètre
-com.
- 19 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
6 - Format de données
MSH propose différent format de présentation des données, par exemple XML :
#Lignes en commentaire
#Exporte les données au format XML
get-process|Export-clixml MesProcess.XML
Vous pouvez utilisez les commandes Format-Table et Format-List pour manipuler le format CVS par
exemple.
- 20 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
En utilisant ETS, les développeurs de cmdlets et de scripts peuvent manipuler des objets .Net et des
données structurées en utilisant la même syntaxe que celle employée par des classes du CLR.
Le langage de script de MSH n'est pas typé (typeless) car une variable n'a pas besoin d'être déclarée
dans un type particulier. Ceci signifie que les variables crée par un développeur sont par nature sans
type. Cependant, le système de MSH est piloté par les types (type-driven) parce qu'il dépend des
noms de type pour fonctionner.
Par conséquent un développeur de script a besoin de la capacité d'énoncer le type d'une de ces
variables et de construire ces propres ensembles d'objets dynamiquement typés qui contiennent des
propriétés et des méthodes et pouvant participer au système piloté par les types. ETS résout ce
problème en fournissant un objet commun au langage de script qui a la capacité d'énoncer son type
dynamiquement et d'ajouter des membres dynamiquement.
Dans certains cas ce système sera utilisé pour créer un alias de propriéte sur une classe particuliére
afin d'homogénéiser l'accés aux données identiques mais nommées différement.
Par exemple certaines collections .NET posséde une propriété nommée length pour déterminer le
nombre d'éléments de la collection alors que d'autres ont une propriété nommée Count. Dans ce cas
pour facilté la manipulation de cette information on ajoutera dans le fichier TYPES.MSHXML
l'extension suivante :
<Type>
<Name>System.Array</Name>
<Members>
<AliasProperty>
<Name>Count</Name>
<ReferencedMemberName>Length</ReferencedMemberName>
</AliasProperty>
</Members>
</Type>
Cet exemple étends le type System.Array. L'affichage des membres du type renvoi désormais :
TypeName: System.Object[]
Note :
- 21 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
Ce mécanisme d'extension est possible car chaque objet que vous employez est encapsulé dans une
instance de la classe System.Management.Automation.MshObject.
MSH> $a=Dir
MSH> $a.MshObject
...
- 22 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
L'intégration d'un nouveau Cmdlet se fait soit à l'aide du programme Make-Shell.exe soit à l'aide du
mécanisme appelé MshSnapIn.
Make-Shell construit un nouveau shell en intégrant les Cmdlets que vous avez créés. Ceci permet
d'avoir plusieurs type de shell dédiés à la gestion des SGBDR, des services Web, etc. Notez que le
shell primaire ne peut être modifié.
La commande suivante crée un Shell (exécutable) nommé newshell qui intégre le cmdlet Get-String
défini dans l'espace de nom PDC.Demos.
Il existe une autre possibilité d'extension du shell avec le Cmdlet MshSnapIns. Consultez la
documentation de PowerShell pour plus de détails.
- 23 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
9 - Configuration de la sécurité
PowerShell intègre la vérification des scripts avant leur éxécution. La politique de sécurité appliquée
aux scripts ou à toutes autres commandes saisies devant être exécutées, est régie par la clé de
registre suivante :
HKLM\Software\Microsoft\msh\ShellId\ExecutionPolicy
Valeur Description
Restricted Valeur par défaut. Niveau de sécurité maximum,
aucune exécution de script, accés interactif
uniquement et charge uniquement les fichiers de
configuration signés dont la signature a été
approuvée.
AllSigned Tous les fichiers .msh et .mshxml doivent être
signée numériquement. Si un fichier signé est
exécuté, le shell vous demandera de confirmer si
l'éditeur de la signature est autorisé ou non à
éxécuter ce fichier.
RemoteSigned Seul les fichiers .msh et .mshxml provenant
d'Internet doivent être signés numériquement. Si
un fichier signé issue d'Internet est exécuté, le
shell affichera un message d'avertissement
demandant confirmation avant son exécution.
Unrestricted Aucun fichier ne doit être signé. Si un fichier
provient d'Internet, le shell affichera un message
d'avertissement demandant confirmation avant
son exécution. Pour supprimer ce message
d'avertissement, faites, dans l'explorateur de
Windows, un clic-droit sur le fichier, puis
"propriétés" et enfin "débloquer".
get-help about_signing|more
- 24 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
10 - La notion de 'globbing'
Cette notion est similaire aux expressions réguliéres qui elles sont accessibles via le framework.
On arrête ici les process dont le nom commence par abc et txyz sauf ceux dont le nom finit par les
lettres de d à t.
Les shell traditionnels traite le globbing sur des noms de dossier. Ici comme on travaille sur des
objets et leurs propriété nous avons un nombre de possibilité extraordinairement riches concernant le
traitement de remplacement de caractères.
- 25 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
11 - Raccourcis clavier
La version actuelle est assez pauvre en raccoucis clavier espéront que la version 1.0 soit mieux
fournis.
Touches de Fonction
F5 Parcourt les dernières commandes vers le début comme la touche 'fléche vers le haut'.
F5 Parcourt les dernières commandes vers la fin comme la touche 'fléche vers le bas'.
Autres touches
Tab complétion. c:\te + Tab complète avec le prochain nom fournis par le provider. Tab sans saisie
affiche la première entrée fournis par le provider courant.
- 26 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction
Introduction à PowerShell (nom de code Monad) par Laurent Dardenne>
12 - Liens
Provider pour Visual Source Safe et SharePoint 2003. Voir aussi les projets de prodivers sur gotdotnet
Workspaces (Nécessite un compte passport Microsoft).
- 27 -
Les sources présentés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page
de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 25/05/2006 -
Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et
jusqu'à 300 000 E de dommages et intérêts.
http://laurent-dardenne.developpez.com/articles/Windows/PowerShell/Introduction