|
Utiliser Microsoft Windows PowerShell
Partie I : Premiers pas avec Microsoft
Powershell. Utiliser Microsoft Windows PowerShell Partie I :
Premiers pas avec Microsoft Powershell. Table des matières: Qu’est-ce
que Windows PowerShell ? Que peut-on faire avec PowerShell ? Quelle configuration est requise pour pouvoir
utiliser PowerShell ? Quelles sont les caractéristiques de Windows
PowerShell ? Les bases de PowerShell avec Get-Command La commande Get-Command –verb set
La commande Get-Command Set-Alias Manipuler du XML avec PowerShell Manipuler des tableaux avec PowerShell Les tableaux associatifs avec PowerShell Manipuler les expressions régulières avec
PowerShell Le pipeline de données avec PowerShell Les filtres des pipelines de données Traitement de fichiers avec PowerShell Partie II à suivre : L’administration avec
Windows PowerShell
Qu’est-ce
que Windows PowerShell ?
Windows
PowerShell est un environnement de ligne de commande Windows conçu pour les
administrateurs système. Il comprend une invite de commande (shell) interactive
et un environnement de script (pouvant être utilisés indépendamment l'un de
l'autre ou ensemble), offrant une manière de traiter des tâches orientées
commande. La philosophie de
Windows PowerShell s’appuie sur deux principes : L’objectif des
concepteurs de PowerSell a été d’obtenir quelques chose d’aussi interactif, de
programmable et composable que le shell UNIX, d’orienté objet, bénéficiant de
la structure du framework Dot NET 2.0, et puis pouvoir accéder aussi facilement
aux fournisseurs du système, accéder à un annuaire, un registre, etc… que la
simplicité que l’on a lorsqu’on accède au système de fichier et à la lecture de
fichiers contenus dans un répertoire. Que peut-on faire avec PowerShell ?Le
point principal d’intérêt de Windows PowerShell est qu’il permet de résoudre
des problématiques d’administration par le Scripting. Par exemple quand on a à
gérer un grand parc de machines, quand on veut faire une opération sur une
machine en général c’est très simple, mais quand on a à répliquer n fois la
même opération sur 10 ou 50 ou 1000 machines ça devient très compliqué, encore
plus quand ce n’est pas intégré dans l’interface graphique. Avec un outil de Scripting
une fois que l’on possède la commande qui fonctionne sur une machine on peut
réaliser une boucle sur le nombre de postes sur lesquels on veut répliquer
l’opération. L’autre
point que peut résoudre PowerShell c’est la possibilité de concevoir de petits
outils d’administration dédiés à certaines tâches spécifiques. Par exemple PowerShell
permet de créer un outil pour créer des utilisateurs avec un certain nombre de
limitations, sans ouvrir toute la richesse fonctionnelle, sans développer une
interface en Visual Studio, pouvant nécessiter une grande connaissance de
programmation et user d’un niveau de complexité très poussé.
Quelle configuration est requise pour pouvoir utiliser PowerShell ?Windows
PowerShell est disponible actuellement en version 1.0 Le pré-requis est le Framework.Net 2.0 Windows PowerShell est
disponible pour :
Pour
Windows Server et Windows XP nous avons 3 versions liées aux problématiques de
langage : -
Nous avons une
version totalement anglaise (KB926139) ; -
Une version
localisée (KB926140 :
comprenant 10 langues : Chinois simplifié, Chinois traditionnel, Français,
Allemand, Italien, Japonais, Coréen, Portugais (Brésilien), Russe et Epagnol) ; -
Une version pour
les systèmes MUI (KB926141).
Microsoft signale que le problème sera résolu
prochainement car sur Windows Server nom de code Longhorn, Windows PowerShell
n’est plus un add-on mais il est intégré complètement dans le système sous
forme de « feature » à activer, car n’étant pas activé par défaut. Quelles sont les caractéristiques de Windows PowerShell ?Les concepteurs de Windows PowerShell ont joué au
maximum la carte de l’homogénéité et de La syntaxe a été alignée sur C#. On peut donc
facilement convertir du code C# en PS et réciproquement. La caractéristique
principale, dans PowerShell Tout est Objet !
Les bases de PowerShell avec Get-CommandLe modèle est basé sur la commande (ou Cmdlet) : < verbe >-< nom
> Le « verbe » définit l’action que l’on va faire (par
exemple Get), suivi du tiret « - », suivi du nom ou type d’objet sur lequel on va
appliquer l’action en question. Exemple : Get-Command La commande Get-Command, est la
première commande à retenir. Elle permet de récupérer la liste des commandes et
leurs paramètres, comme nous pouvons le voir ci-dessous :
Nous pouvons retenir pour commencer 4 commandes de base récurrentes : Get-Command Informations
de base sur les commandes Get-Help Aide de base (utiliser –full) Get-Member Informations
sur les objets Get-PSDrive Informations
sur les lecteurs étendus Ci-dessous un tableau présentant quelques-uns des
nombreux paramètres de Windows PowerShell :
Il y a 129 « Cmdlet » (prononcer
« comandelette ») prédéfinies par défaut dans le système. La commande Get-Command –verb setLa commande Get-Command –verb set
permet de récupérer tout simplement toutes les commandes dont le verbe commande
par « set ».
La commande Get-Command set*
renvoie tout ce qui commence par « set » en tant que Cmdlet,
comme ci-dessus… Mais aussi...
Comme vous pouvez le remarquer, elle renvois d’autres
types de commandes,
Comme nous pouvons le constater dans la colonne de gauche « CommandType », « set » est un Alias, qui permet de faire un raccourci pour une
commande plus complexe.
« sethc.exe » par
exemple est une Application (.exe), donc si on tape la commande dans la
fenêtre de PowerShell cela exécutera la commande en question.
La commande Get-Command Set-AliasRevenons à une commande, la commande Get-Command set-alias. Nous pouvons la formater la présentation de façon
plus sympathique. Tapons la commande comme ceci : Get-Command set-alias | format-list *
Cette commande permet d’obtenir plus de détails, en
particulier la « dll » de PowerShell à laquelle elle correspond, et sa
définition complète avec tous les paramètres de la commande. Comme nous venons de le voir avec « set* », des commandes peuvent être des « .exe », nous
pouvons récupérer des informations sur ipconfig
en lançant la commande Get-Command ipconfig | format-list *
Comme
nous le voyons ci-dessus, la commande ipconfig
renvoie à l’application ipconfig.exe
qui a pour path (chemin) C:\WINDOWS\system32\ Cette
méthode est valable aussi pour récupérer sur le PowerShell que nous utilisons. Tapons la commande: Get-Command powershell | format-list *
Nous
obtenons quelques informations, entre autres la version (FileVersion), et la
langue (Language) de l’application qui est exécutée.
La commande Write-HostTout
Shell possède son fameux « Hello
World », et sur PowerShell nous avons la commande suivante qui permet
de l’écrire de cette façon : write-host Hello World
Evidemment PowerShell va
plus loin que ce type d’usage, nous allons le voir. La commande Get-HelpDeuxième commande à retenir,
la commande get-help
Cette
commande ne se contente pas de fournir la liste des commandes disponibles, elle
fournie aussi des informations sur les commandes en question. Ci-dessus
nous obtenons de l’aide sur l’aide, ce qui n’est pas le plus intéressant. Par
contre si nous tapons la commande get-help * nous obtenons
de l’aide sur tous les objets qui ont une aide correspondante, nous
n’afficherons pas toute la liste affichée sur la capture d’écran suivant...
Dans cette liste nous avons
de l’aide pour de nombreuses
catégories : Alias, Cmdlet, Provider, et HelpFile.
Helpfiles correspond aux éléments commençant par « about_ », ce sont des ensembles de fichiers d’aides
associés au système.
Ils donnant des informations
sur pas un mais plusieurs ensembles de commandes, ici par exemple « about_Flow_Control » qui concerne les boucles. La commande get-help peut être abrégée par la commande help. Cette commande abrégée donne
le même résultat que nous avons eu sur les précédents écrans, mais nous avons
cette fois-ci une vue page par page avec l’invitation « -- Suite -- », en bas à gauche de notre écran PowerShell, qui
permet de passer à la page suivante en pressant la barre d’espace du clavier.
Couramment, la commande get-help est à utiliser avec l’extension –full. Si nous faisons un get-help <nom>
on a droit seulement à un premier niveau qui ne donne pas toujours des
informations pertinentes, alors qu’en tapant get-help <nom> -full nous obtenons de l’aide accompagnée d’exemples associés qui sont en
général plus parlant. Le plus souvent les
commandes commençant par get-<nom> ont comme
abréviation le <nom> seul car get- est le verbe par défaut que l’on peut appliquer.
La commande Get-Help AboutLa commande get-help about* nous permet de visualiser toute la liste des fichiers
« about_ ».
Ces fichiers comme on a dit
plus haut sont des fichiers d’aides (Helpfiles). Nous pouvons en ouvrir un, par exemple get-help
about_commonparameters :
C’est le fichier « about_ » des paramètres communs. Les
129 commandes de PowerShell ont un certain nombre de paramètres ( Parameters ) qui eux aussi sont communs, permettant par
exemple de définir le niveau de verbosité ( Verbose ) de la
commande, de pouvoir effectuer du débogage ( Debug ), … Il
y a deux paramètres très intéressants, disponibles seulement sur les commandes
modifiant le système, et disponibles en bas de cette page d’aide de about_commonparameters : WhatIf et Confirm
WhatIf et Confirm sont deux paramètres que l’on peut ajouter à la fin
d’une commande délicate, par exemple une commande pouvant supprimer 10.000
fichiers. Le
paramètre WhatIf ne va pas exécuter la commande mais simuler les
fichiers qu’il aurait supprimés si la commande avait été réellement exécutée. Le
paramètre Confirm quand à lui passe à l’étape supérieure, c'est-à-dire
qu’il exécute la commande, mais avant d’exécuter la commande, par exemple celle
susceptible de supprimer nos 10.000 fichiers, il va demander « Etes-vous bien sûr de vouloir exécuter la
suppression ? Oui ou Non ?». Donc
tout cela est décrit dans le fichier « about_ ». Ces fichiers
d’aides « about_ » sont situés dans C:\WINDOWS\system32\windowspowershell\v1.0
Tous les fichiers « about_ » sont
stockés dans le dossier de langue, dans notre cas le dossier « fr ».
Ces fichiers sont au format « .txt » (texte).
Nous
poursuivons encore un peu avec la commande Get- . Si
nous tapons la commande Get-Command Get* nous
permet d’obtenir toutes les commandes commençant par Get- .
Si nous tapons la commande Get-Date nous obtenons bien entendu la date.
Si nous tapons la commande Date nous obtenons le même résultat.
Mais
attention, il y a une exception à cette méthode de commandes abrégées. Si
vous tapez Command, vous n’allez pas
obtenir un Get-Command, mais nous
obtenons l’ancien Shell Windows Dos :
De ce fait, si nous tapons
la commande help, nous sommes dans le
cmd.exe classique :
Donc nous devons ressortir
du cmd par la commande exit pour nous retrouver
dans le Windows PowerShell :
Nous
pouvons vérifier notre précédente exécution de lancement d’une application depuis
PowerShell en utilisant justement la commande get-command command,
cela nous affiche ceci :
C’est
bien le command.com depuis le system32 qui a été lancé à partir de la commande Command. Revenons
aux Alias. Rappelons
qu’un alias est un autre nom ou surnom utilisé pour une applet de commande ou
un élément de commande, tel qu'une fonction, un script, un fichier ou un
fichier exécutable. Il est possible d’utiliser l'alias au lieu du nom d’une commande. L’un
des Alias les plus courant est dir. Tapons cette
commande :
Il
faut garder à l’esprit que dir n’est pas une
commande de PowerShell. La commande dir étant tellement
connue et utilisée qu’elle a été intégrée à PowerShell sous la forme d’un
Alias. Tapons maintenant la
commande get-command
dir :
Nous voyons que la vraie définition de l’Alias
dir est Get-ChildItem. Ce
qui veut dire que soit on utilise Get-ChildItem, soit on
continue à utiliser dir. Mais
il faut soulever un risque avec l’usage des Alias. Il faut rappeler qu’un Alias
peut être à tout moment redéfini, et cela peut-être sources de problèmes dans
l’exécution des scripts. Par conséquent il est recommandé d’utiliser tout de
même la commande prédéfinie, le Get-ChildItem dans les
scripts à la place du dir. Regardons
maintenant la commande get-command help :
On
remarque que si on tape help c’est une fonction,
par contre si on tape help.exe on fera appel à
une application. A
savoir que dans PowerShell il y a une notion de précédence. Si on tape help PowerShell fera passer en priorité la fonction. Par
contre si on détruit la définition de fonction PowerShell lancera
l’application. Chose
intéressante, nous pouvons récupérer la définition de la fonction. La
get-command récupère un tableau, et si on récupère le premier
élément du tableau on a la fonction help. Tapons la syntaxe suivante (get-command
help)[0].definition :
Cela nous donne une idée de code en PowerShell. Déplaçons-nous sur le dossier temp placé sur le disque du C:\
en tapant : cd c:\temp
Ensuite tapons notre alias dir pour voir le contenu de notre dossier :
Nous pouvons voir que notre dossier contient un
fichier nommé monscript.ps1. C’est un script PowerShell, identifaible par
l’extension.ps1. Un ensemble de commandes PowerShell stockées dans
un fichier .ps1, mais ce type de fichier n’est pas exécutable par
défaut. Par défaut ce fichier est seulement éditable. Revenons à nouveau à get-command. Si nous faisons un get-command de monscript.ps1, il va détecter le script… Tapons la commande get-command ./monscript
PowerShell nous indique que c’est un scripte externe,
et qu’il est stocké dans c:\temp.
A retenir pour conclure cette partie, nous avons 5 catégories de commandes :
La manipulation d’objetsComme nous l’avons dit en
première partie, « tout est objet » dans PowerShell. Nous allons voir ce qui est
manipulable à partir de PowerShell. Les expressionsNous pouvons manipuler des
nombres et des expressions dans PowerShell. Tapons 22 * 4 dans PowerShell
Nous obtenons le résultat de
cette opération toute simple. PowerShell
permet d’utiliser des constantes, par exemple Kb, Mb et Gb sont reconnues comme
respectivement Kilobites, Mégabites et Gigabites, cela peut être utile dans des
scripts.
Nous
pouvons manipuler des chaines de caractères, par exemple : Tapons : "Le
petit chat" + " est dans" + " l’arbre"
Nous pouvons aussi manipuler des entiers, des flottants et des chaines
de caractères ensemble. Tapons par exemple : 8 + 5.2 + "36"
Nous voyons dans cette expression que la chaine de caractères
« 36 » a été convertie en valeur numérique et additionnée à l’entier
et au flottant.
Les variablesPowerShell permet de manipuler des variables. Tapons : $a="PowerShell est
génial" $a.length
Dans la variable a nous avons mis une chaine de caractères et nous avons
récupéré sa longueur par length. Ensuite
nous pouvons tout mélanger, c'est-à-dire des expressions et des commandes. Par
exemple tapons: $a.length
*2
Nous
lançons une opération un peu plus complexe :
Le résultat est …
Par contre si nous
tapons : write-host
(date).day + 5 Le résultat n’est pas le
même …
Comme
nous pouvons le comprendre, la différence des résultats s’explique au niveau des
positions des parenthèses : ·
Dans la première
ligne nous évaluons toute l’expression sous forme numérique. En effet nous
sommes le 12 décembre 2008, et si nous additionnons 12+5 nous obtenons bien 17. ·
Dans la seconde
ligne les parenthèses n’englobent pas l’expression, nous restons avec une
chaine de caractères, ce qui nous donne 14 + 5. Grâce
à cet exemple nous voyons bien que nous pouvons maitriser le niveau
d’évaluation sur les expressions. Autre
exemple de calcul… Dans
la partie précédente de ce tutoriel, nous avons vu les commandes avec get-command. Si
nous tapons (get-command).count Nous
obtenons…
Nous
avons bien la confirmation qu’il y a bien 129 commandes prédéfinies dans
PowerShell. Retournons
sur path C:\ en tapant cd c:\ Nous
tapons maintenant (get-command *.exe).count * 10
Nous obtenons le nombre de
commandes exécutables accessibles dans le path courant, et ce total est
multiplié par 10 pour notre exemple. Ce qui veut dire que nous
avons 410 commandes exécutables disponibles.
Les types d’objetsNous
avons tapé plus haut une variable à une chaine de caractères de type : $a="PowerShell est génial" Si
nous tapons : $a.gettype()
Nous venons de récupérer le
type de l’objet, du type « String »
au sens Dot Net. Nous pouvons à nouveau manipuler l’expression que
nous avons vu plus haut, comportant un entier, un flottant et une chaine de
caractères. Tapons cette fois-ci : (8
+ 5.2 + "36").gettype()
PowerShell converti dans le
type numérique le plus grand pour englober l’ensemble des chiffres disponibles. Nous pouvons forcer les
types : Tapons : $a
= [int] " 4 " Et ensuite tapons : $a.gettype()
Dans
la variable « a » nous mettons une chaine de caractères
« 4 » et on la force à être de type « integer », forçant la conversion comme nous l’avons eu dans
l’expression précédente. Autre exemple avec une
chaine de caractères que nous forçons à être du type date. Tapons : $d
= [datetime]"2008-03-19" Et ensuite tapons : $d.gettype()
Nous avons demandé à PowerShell de convertir tout
simplement la variable « d » contenant
la chaine de caractères « 2008-03-19 » en type « date ». Nous voyons bien ci-dessus sur la capture que
PowerShell a bien récupéré la chaine de caractères de la variable
« d » et qu’il l’a transformé en un objet de type « DateTime ». Maintenant ajoutons 100
jours à notre date. Tapons : $d.adddays(100)
PowerShell nous effectue le
calcul en ajoutant 100 jours à la variable « d ». La commande Get-MemberNotre
3me fonction à retenir est Get-Member. Nous
avons « $d » qui est une variable de type date définie plus
haut :
Tapons $d | get-member
Get-Member permet
d’obtenir toutes les propriétés, les méthodes accessibles sur un objet. Ici
nous avons une variable de type « date », par conséquent nous
obtenons la liste des fonctions prédéfinies de type « date ». Lors de
conception d’un script il suffit de chercher la bonne fonction prédéfinie qui
va bien avec notre objet. Tapons : $d | get-member -membertype
property
Souvenez-vous de Get-ChildItem. Nous l’avions vu avec son Alias Dir. Nous pouvons aussi effectuer
un Get-Member à Get-ChildItem. Tapez : Get-Childitem | get-member
La liste fait plusieurs
écrans, la capture écran est bien raccourcie. Nous obtenons sur l’expression Get-Childitem | get-member toutes les opérations disponibles sur les fichiers, par exemple la
dernière date de mise à jour…etc… Faisons la même chose sur du
numérique. Tapez : 1 | get-member -membertype method
Nous
avons beaucoup moins de fonctions standard prédéfinies sur les numériques. Pour
toutes manipulations de nombres en PowerShell il faut accéder à la librairie
mathématique. Soit on exécute les 4 opérations classiques, dans ce cas elles
sont intégrées à PowerShell, par contre pour toutes les opérations plus
poussées (logarithmes, cosinus), on y a accès via la librairie mathématique du
framework Dot Net.
Manipuler du XML avec PowerShellPowerShell
est capable de manipuler du langage XML, type prédéfini par défaut. Il
suffit de signaler la variable XML en la mettant entre crochets en début du
code. Tapons
le code suivant : $l = [xml]( "<livre code='1-506043-45-10'>
<titre>Jurassic Parc</titre> <prix>19.95 </prix>
</livre>")
Tapons : $l
Rien
de phénoménal jusque là… Tapons maintenant : $l.livre
Là
par contre nous avons d’affiché les différents champs XML. Et
si nous voulons récupérer un champ précis, prenons le prix, il suffit de
taper : $l.livre.prix
Nous arrêterons là notre exemple avec XML, les
possibilités étant nombreuses il faudrait beaucoup plus de temps pour aborder
le sujet XML/PowerShell en profondeur. Manipuler des tableaux avec PowerShellPowerShell
permet de créer des tableaux simplement avec des virgules. Tapons : $t=1,2,3 $t.gettype()
Le
résultat affiché nous indique bien que nous récupérons bien un Array, c'est-à-dire un tableau « Object [] », d’objets. Nous
avons donc un tableau « t » initialisé avec 3 valeurs (1,2,3). Attention
ici « 1,2 » c’est un tableau à deux éléments, ce n’est donc pas un
« 1.2 », cela ne veut pas dire la même chose. Nous
allons affecter notre tableau « t » dans « u ». Tapons : $u = $t Et
tapons : $u
Nous
obtenons bien notre tableau dans « u ». A
savoir, les tableaux sont indexés à partir de 0. Nous
allons justement modifier le premier élément de notre tableau. Tapons : $t[0] = "abc" Et
regardons maintenant le contenu de notre tableau « t », en tapant : $t
Nous
avons bien notre premier élément qui a été modifié. Il
est tout à fait possible de mixer des chaines de caractères et des entiers, car
comme vous le savez déjà, tout est objet, et nous manipulons ici des objets
dans notre tableau. Le
« u » a été affecté un peu plus haut, et a été
modifié aussi :
Dans
« $u» nous avons un pointeur vers « $t ». Nous
avons donc une affectation par valeurs. L’opérateur
« + » entre deux tableaux permet de concaténer. Tapons : $v = $t + $u Et
tapons : $v
Nous
avons donc un tableau de 6 valeurs. Nous
pouvons forcer aussi un tableau à contenir que des entiers. Tapons : $t = [int[]](1,2,3) Demandons-lui
maintenant d’insérer une chaine de caractères dans notre tableau. Tapons : $t[0] = "abc"
Nous
avons un message de refus car il ne peut pas convertir « abc » en entiers. Il
est possible aussi d’utiliser la multiplication sur les tableaux. Tapons : $t = $t* 3
Et nous pouvons voir la
longueur de notre tableau. $t.length
Les tableaux associatifs avec PowerShellPar défaut nous allons créer
un tableau vide sous PowerShell en tapant : $h = @{}
Ensuite
nous allons indexer notre tableau, non pas par un indice numérique mais une
chaine de caractères. Nous allons donner une correspondance entre les dieux
grecs et romains. Par exemple ici, « Hermes » correspond au dieu
« Mercure ». Tapons : $h["Hermes"]= "Mercure" $h["Zeus"]= "Jupiter" $h["Posseidon"]= "Neptune" $h["Hades"]= "Pluton" $h
Nous avons en quelques
secondes un tableau explicite qui nous affiche les correspondances des dieux
mythologiques. Prenons juste un élément et
regardons sa correspondance : Tapons : $h["Hermes"]
Manipuler les expressions régulières avec PowerShellLes
expressions régulières peuvent permettre de récupérer et de reformater des
informations précises et en quantité, en effectuant par exemple des recherches
sur du texte. Ce type d’usage avec les expressions régulières est couramment
utilisé avec PERL. Sous PowerShell tapez : net config workstation
Notre objectif ici est de
récupérer le nom du système d’exploitation « Windows » et la version
« 2002 ». Chaque ligne est accessible
via un tableau. Ici c’est la sixième ligne qui nous intéresse. Tapons : $n = (net config workstation)[6] $n
Ici
nous avons bien la ligne qui nous concerne. Maintenant
nous allons « matcher » (comparer les éléments) dans notre ligne pour
récupérer les éléments de la façon suivante :
Le
« .* » précise que c’est un ensemble de caractères
qui se répètent. Le
« [^.] » précise que l’on prend tout ce qui n’est pas
un point et plus. Nous tapons la
commande : $n -match '^Version du
logiciel.* (?<os>[^.]+)\ (?<vers>[^.]+)' Nous obtenons un « True »…
… Ce qui veut dire que notre
expression est correcte et que les éléments ont été récupérés. Nous allons vérifier si nous
avons récupérés les bonnes chaines de caractères. Tapons : $matches.os et $matches.vers
Nous avons réussi.
Le pipeline de données avec PowerShellLe
but est de canaliser et diriger des données, surtout quand nous en avons une
grosse quantité à manipuler. Il ne faut pas perdre de vue que tout ce qui va
circuler dans notre « pipeline » (ou pipe, symbolisé par « | ») ce sont des objets. Premier
exemple, tapons : get-help | more
Un
autre exemple permettant de récupérer les Get-Command set*,
et de classer (« sort ») par types de commandes (« commandtype »). get-command set* | sort commandtype
Donc,
comme nous l’avons dit plus haut, ce ne sont pas des chaines de caractères qui
nous sont renvoyées, mais…
… un tableau d’objets. Un .gettype() nous le prouve. Et si nous allons contrôler
en détail les lignes de ce tableau, en tapant : (get-command set* | sort
commandtype)[0].gettype()
Nous pouvons constater que
ce sont des informations de type AliasInfo sur des commandes qui sont
affichées. Autre exemple de commande
qui peut nous renvoyer des informations : get-process | sort processname
Comme vous pouvez le voir,
nous obtenons la liste des process actifs sur la machine, triés par les noms de
process. Et nous en avons la
confirmation par : (get-process | sort
processname)[0].gettype()
PowerShell
nous renvoie des informations de type process. Et encore une fois ce ne sont
pas des chaines de caractères mais ce sont bien des objets. Sous PowerShell on peut
évidemment lancer la commande ipconfig.
Il
est évident aussi que ipconfig ne sait pas
qu’elle doit renvoyer des objets. Si on tape (ipconfig).gettype()
On
a confirmation qu’elle ne fait que renvoyer un tableau d’objets, mais ces
objets ne sont que des chaines de caractères. Tapons
ceci : (ipconfig)[0].gettype()
Cela
veut dire que toutes les commandes qui existaient avant PowerShell renvoient
des chaines de caractères, ce qui permet de travailler avec ensuite. Autre
exemple. Tapez : netstat -e
Et si nous tapons : (netstat -e) | where { $_ -like "*paquets*"
} Avec la commande where on demande de récupérer toutes les lignes qui
contiennent le mot « paquets ».
Les filtres des pipelines de donnéesNous
allons passer à un niveau supérieur dans les commandes liées aux pipelines de
données, en exploitant les filtres, permettant de modifier les commandes
initiales. Refaisons un get-process
Nous
allons lancer un nouveau where sur un type de process
en effectuant une recherche par nom de process. « $_ » désigne l’objet courant passé dans le « pipe ». Ici nous allons chercher le
process se nommant « svchost ». Tapons : get-process | where { $_.processName -eq
"svchost"}
Nous pouvons formater la
commande afin qu’elle ne renvoie seulement certaines parties de la réponse. Ce
formatage s’effectue par format-table. Tapez : get-process | where { $_.processName -eq
"svchost"} | format-table Processname,id –auto
Le format-table a gardé seulement les colonnes ProcessName et Id. Nous pouvons aller plus
loin, en donnant des instructions sur le process en cours. Ici nous pouvons lancer un
« stop-process ». Mais l’arrêt d’un process est une procédure
agressive, donc nous allons ajouter le paramètre –whatif get-process
| where { $_.processName -eq "svchost"} | stop-process –whatif Comme nous l’avons déjà dit précédemment,
l’usage du paramètre –whatif permet d’éviter l’exécution réelle d’une
commande, il ne fait que « simuler » l’arrêt du process, et affiche
un résumé des conséquences d’une véritable exécution, ici celle d’un « stop-process ».
Autre exemple de commande
plus agressive, tapons : get-process
| where { $_.processName -eq " svchost"} | stop-process –confirm
Le
paramètre –confirm
permet d’avoir une demande de confirmation avant d’appliquer Une petite synthèse pour clôturer cette partie sur la manipulation d’objets :
On
n’accède jamais directement aux objets dans PowerShell, on y accède par
l’intermédiaire d’adaptateurs qui sont chargés de créer une uniformisation du
système de gestion des objets. L’idée de Microsoft est qu’il est possible, via
PowerShell, de manipuler des éléments venant de l’environnement .Net, de
l’environnement WMI, de l’environnement COM, et cela à partir du moment où ils ont
été créés sous forme de variables ce sont tous des objets et se manipulent tous
de la même façon. Comme on le voit sur le schéma « L’accès aux objet par PowerShell », on obtient un accès
uniformisé aux objets.
Un
résumé ci-dessous des Types .Net avec
les Alias PowerShell :
Un tableau récapitulatif des nombres
gérés par PowerShell :
Pour plus de détails, tapez sous
PowerShell : [math]
| get-member -static Ci-dessous
un tableau récapitulatif des nombres et
opérateurs sous PowerShell :
Pour plus de détails, tapez
sous PowerShell : help
about*operator* Un
tableau récapitulatif des instructions
de contrôle de flux sous PowerShell :
Ci-dessous un résumé des fournisseurs et magasins de données :
PowerShell intégré au systèmeRegardons les lecteurs que
nous avons à disposition sur notre machine en tapant la commande
suivante : Get-psdrive | sort provider,root
Nous
récupérons par cette commande l’ensemble des lecteurs (Drives) disponibles, et par les accès visibles sur cette liste nous
voyons que par PowerShell nous pouvons aller bien au-delà, car nous allons
pouvoir parcourir les Alias, les variables d’Environnement, dans les Fonctions,
et aussi aller dans la base de registre. Tapons maintenant : Get-psprovider
Cette commande fournie tous
les providers disponibles par le système. Ce sont les providers
définis par défaut, et il est possible d’en rajouter d’autres. Si nous souhaitons aller sur
le Drive Environment (Env), il suffit de taper la commande suivante : cd env:
Ce n’est pas plus difficile
que de rentrer sur un lecteur C ou D classique. Si nous tapons la commande
suivante : Dir Nous
pouvons voir toutes les variables d’environnement, récupérer leurs valeurs, et
nous pouvons nous en servir pour paramétrer des scripts. Nous allons maintenant dans
le magasin des Alias en tapant : Cd alias: Dir
Nous récupérons tous les
Alias définis sur notre système. Si nous tapons : Cd hkcu: Dir
Nous
sommes rentrés dans Maintenant revenons sur le
disque C : , tapons : cd c:\
Traitement de fichiers avec PowerShellNous allons voir maintenant
la manipulation de fichiers de type « Texte ». Exemple : $s = get-content $PSHOME\fr\about_Assignment_Operators.help.txt
Nous allons demander
la longueur de notre objet, en tapant : $s.length
En
fait nous venons de récupérer dans notre variable $s le contenu d’un fichier
présenté sous la forme d’un tableau contenant des chaines de caractères.
Chaque
ligne est dans une chaine, et en demandant un .length nous avons
obtenu le nombre de lignes de caractères, 444, contenues dans le fichier texte.
Nous allons taper : $s[12]
Nous venons d’effectuer une
lecture de la ligne n°12 du fichier texte.
Si nous ouvrons dans le bloc
note le fichier about_Assignment_Operators.help.txt, nous avons exactement cette ligne du fichier d’aide.
Ceci nous confirme que nous obtenons bien des lignes de caractères dans un
tableau. Maintenant utilisons une
fonction « join », et faisons lui concaténer l’ensemble dans
notre variable $s. Tapons : $s = [string]::join("",$s) Tapons ensuite : $s.length $s[12]
En fait nous venons de lui demander de supprimer les espaces entre les
caractères et les retours de lignes. Nous n’avons plus qu’un tableau contenant
que des caractères. Donc le « O »
affiché suite à la commande $s[12] correspond au
12me caractère. Nous
pouvons aussi travailler sur des mots (words). Il
existe une fonction permettant de « splitter » (qui pourrait se
traduire par séparer) selon un espace ou une tabulation. Tapons : $words = $s.split("
`t",[stringsplitoptions]::RemoveEmptyEntries)
En tapant un $words.length nous avons 2454 mots distincts dans le fichier
initial. Nous pouvons obtenir plus d’informations sur la
fonction split en tapant : Get-help split –full | more Tapons maintenant : $uniq = $words | sort -uniq La
variable unique nous permet de supprimer tous les mots en double de la
variable.
Il
ne nous reste plus que 554 mots uniques. Maintenant passons à
quelque chose de plus poussé, en utilisant le mécanisme de hachage, mécanisme
vu dans la partie des tableaux associatifs ($h = @{}) plus haut dans
notre tutoriel. Le type d’écriture que nous allons employer est à utiliser avec
précautions selon l’usage que vous souhaitez en faire par la suite. Tapons : $words
| % { $h=@{}} {$h[$_] +=1} Explications : Puis tapons : $h | more Regardons
le résultat :
Le
résultat faisant plusieurs pages, l’aperçu a été raccourci. Nous obtenons un tableau avec une colonne de gauche
qui liste les mots uniques, et la colonne de droite qui indique le nombre de
fois que nous trouvons nos mots dans notre texte initial. Comme nous avons un tableau de hachage des paramètres
par défaut sont disponibles, qui nous permettent de récupérer par exemple le
nombre de lignes distinctes. Pour
cela tapez : $h.psbase.keys.count
Nous avons 554 lignes distinctes. Maintenant
nous allons grouper notre ensemble de
mots et le trier en tapant : $grouped = $words | group | sort count Et
nous pouvons voir ceux qui sont les plus utilisés en tapant : $grouped[-1..-10]
Le
résultat parle de lui-même. Ces
exemples avec la manipulation de textes donnent déjà une idée des applications
possibles avec des journaux système. Voyons
cela en tapant : Get-eventlog –list
PowerShell
nous liste l’ensemble des fichiers de journaux système présents sur notre
machine. Tapons ceci : Get-eventlog system | more
Nous
venons d’accéder aux fichiers de journaux système, dont la liste est très
longue, et encore une fois nous récupérons des objets, ceci étant de type
« événements ».
PowerShell intégré avec WMIAutre méthode permettant
de manipuler des données traitant de l’état de notre système, c’est d’employer
la commande get-wmiobject. Tapons :
get-wmiobject -list | more
Nous
avons accès à l’ensemble des (très nombreuses) variables WMI (ou classes objets
WMI) disponible sur le système. Bien
sûr il suffit de prendre la bonne classe WMI qui correspond à l’information que
vous recherchez. Tapons par exemple: get-wmiobject
win32_computersystem
Nous
pouvons aussi avoir besoin de récupérer des informations sur la mémoire
virtuelle ou physique de notre machine. Tapons : get-wmiobject -class Win32_OperatingSystem
-namespace root/cimv2 -computername . | Format-list TotalVirtualMemorySize, TotalVisibleMemorySize,
FreePhysicalMemory, FreeVirtualMemory,FreeSpaceInPagingFiles
Mais
là où ça devient très intéressant, c’est que WMI est activable à distance, par
exemple en tapant : get-wmiobject -class Win32_LogicalDisk
-computername fabricer01 On
obtient l’état WMI d’un poste précis dans le réseau à distance.
PowerShell intégré avec COMAvec la commande $ui = new-object -ComObject
"Shell.Application"
, nous pouvons récupérer une boite de
dialogue permettant d’obtenir un chemin de répertoire. Tapons cette commande : $path = $ui.BrowseForFolder(0, "Choisissez un répertoire,
svp...",0,0)
Tapons ensuite : $path.Self.Path
Nous
sommes bien sur le C:\temp. Un
autre exemple. Tapons : $ie = new-object –com
internetexplorer.application Puis tapons : $ie.navigate2("http://www.google.fr") $ie.visible = $true
Que s’est-il passé ? Nous avons créé un new-object –com d’application,
placé dans une variable $ie, ici notre objet est
l’application Internet
Explorer, et nous lui avons passé une URL. Ici l’URL est "http://www.google.fr". Cette URL aurait très bien pu être locale. Par
défaut cette URL ne s’affiche pas. On l’affiche en mettant un visible = $true sur notre objet $ie. Maintenant
nous allons voir à titre de démonstration un exemple de code plus poussé. Ce
code montre comment créer des boites de dialogues faisant appel à la
bibliothèque Windows.Forms. Cette
bibliothèque se charge de cette façon : [reflection.assembly]::LoadwithPartialName("System.Windows.Forms"); Et
ensuite on lance le reste du code : $form= new-object system.windows.forms.form $form.topmost = $true $button= new-object
system.windows.forms.button $button.dock = “Fill” $button.text = “PowerShell for ever ! :-)
“+ (get-date) $button.add_Click({$button.Text =
(get-date)}) $form.Controls.add($button) $form.showdialog() On
obtient :
Notre
boite de dialogue est un bouton, qui par un clic dessus change l’affichage.
Un
tableau récapitulatif sur la manipulation
des fichiers sous PowerShell :
Ci-dessous un tableau
résumant les manipulations de texte sous
PowersShell :
Un
tableau présentant les ordres de
formatage sous PowerShell :
Un tableau résumant les commandes d’accès au système sous
PowersShell :
Un
résumé ci-dessous présentant la stratégie
d’exécution sous PowerShell :
Plus
de détails : help
about_signing
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||