Programmation PowerShell/Version imprimable

Un livre de Wikilivres.

Ceci est la version imprimable de Programmation PowerShell.
  • Si vous imprimez cette page, choisissez « Aperçu avant impression » dans votre navigateur, ou cliquez sur le lien Version imprimable dans la boîte à outils, vous verrez cette page sans ce message, ni éléments de navigation sur la gauche ou en haut.
  • Cliquez sur Rafraîchir cette page pour obtenir la dernière version du wikilivre.
  • Pour plus d'informations sur les version imprimables, y compris la manière d'obtenir une version PDF, vous pouvez lire l'article Versions imprimables.


Programmation PowerShell

Une version à jour et éditable de ce livre est disponible sur Wikilivres,
une bibliothèque de livres pédagogiques, à l'URL :
https://fr.wikibooks.org/wiki/Programmation_PowerShell

Vous avez la permission de copier, distribuer et/ou modifier ce document selon les termes de la Licence de documentation libre GNU, version 1.2 ou plus récente publiée par la Free Software Foundation ; sans sections inaltérables, sans texte de première page de couverture et sans Texte de dernière page de couverture. Une copie de cette licence est incluse dans l'annexe nommée « Licence de documentation libre GNU ».

Introduction

Pour commencer, PowerShell est un langage de script et un shell permettant de traiter des commandes.

PowerShell (ci-après PS) a la particularité d'être un shell objet. Quand vous utilisez un terminal classique tel que cmd.exe ou bash, vous exécutez des commandes et du texte est renvoyé. PS utilise des technologies modernes et renvoie des objets qui seront affichés sous forme de texte.

Vous vous demandez certainement en quoi cela peut vous être utile d'apprendre ce langage, dans la mesure où vous pouvez potentiellement très bien vous en passer. PowerShell est destiné à ceux qui veulent aller plus loin dans l'administration et l'automatisation de leur ordinateur, qu'il s'agisse d'une machine cliente ou d'un serveur.

Tout le monde s'y est mis, il existe des modules (des extensions) qui vous permettront d'utiliser le PS avec de nombreuses technologies telles que les serveurs LDAP, les serveurs de messagerie, etc.

Dans cette première partie, vous pourrez trouver une petite histoire de PowerShell ainsi que quelques explications vous permettant d'appréhender les chapitres qui suivent. Il sera aussi décrit les pré-requis nécessaires pour utiliser PowerShell sur un ordinateur.

Rapide histoire de la technologie PowerShell[modifier | modifier le wikicode]

PowerShell est basé sur le framework .NET (dot net Windows). Son histoire est donc liée à ce framework dont la première version commerciale est sortie en 2002. Windows PowerShell a été pensé et créé par plusieurs ingénieurs dont M. Jeffrey Snover qui en est l'inventeur selon Wikipedia. Après avoir travaillé pour d'autres grands acteurs de la branche, M. Snover a rejoint Microsoft en 1999. Dès 2003 déjà, il travaille sur un shell objet. En 2006, la version 1.0 de PowerShell est distribuée officiellement. Avec l'arrivée de Windows 7 en 2009, PowerShell est le shell par défaut de Windows et cmd.exe a été laissé pour des raisons de compatibilité. Initialement prévu pour l'administration système, PowerShell est régulièrement étendu et les principaux acteurs du marché fournissent des modules permettant d'automatiser les tâches sur leurs produits. En plus de l'offre commerciale, il y a beaucoup de modules libres distribués, par exemple, sur powershellgallery. Comme PowerShell peut faire tout ce que peux faire .NET, certains développeurs l'utilise parfois aussi. Récemment, Microsoft développe un framework dotnet destiné à tous les systèmes d'exploitation incluant les mondes Linux et Mac. En 2018, PowerShell suit le mouvement en sortant PowerShell Core 6.0 (licence MIT).

Principe de la ligne de commande et de la console[modifier | modifier le wikicode]

Pour interagir avec un ordinateur, nous utilisons actuellement la souris et une interface graphique (des jolies fenêtres avec effets et animations, images, etc.). Taper une commande peut paraître désuet. Pourtant, dans certains cas, la ligne de commande est plus rapide et plus précise. Utilisée dès le début de l'informatique, la ligne de commande a l'énorme avantage de permettre l'automatisation des actions. Un exemple vaut parfois mieux que des explications confuses. Testez ceci : Avec l'interface graphique, démarrez PowerShell, tapez

notepad 

puis tapez la touche retour ou entrée ce qui exécutera l'action. Avec l'interface graphique, cliquez sur Démarrer, tous les programmes, bloc-notes ce qui effectuera la même action. Chaque instruction fait donc la même chose lorsque vous tapez la touche retour ou entrée que lorsque vous cliquez sur l'icône ! Toutes les instructions peuvent être enregistrées dans un bête fichier texte (avec le notepad par exemple) et vous pouvez exécuter chaque commande une à une. Cela s'appelle un script.

De l'intérêt des scripts[modifier | modifier le wikicode]

Automatiser les tâches récurrentes ce qui va indirectement produire les effets suivant :

  • Éviter les erreurs humaines (incohérences au niveau de l'orthographe, oublis, etc.).
  • Gagner en efficacité car, une fois réalisé, le script va vous faire gagner de nombreuses heures de travail.

Pré-requis pour se lancer dans PowerShell[modifier | modifier le wikicode]

Sur Linux, vous devez d'abord installer PowerShell Core selon la procédure de la documentation Microsoft. Pour Windows, tout est déjà préinstallé. Il n'y a aucun prérequis technique selon moi à part peut-être, être administrateur de l'ordinateur et encore, ce n'est pas rédhibitoire. Il vous faut surtout un but à atteindre et un intérêt pour la programmation. Osez mettre les mains dans le cambouis et le reste suivra !


Démarrer avec PowerShell

Maintenant que vous savez d'où vient PowerShell et que vous connaissez ses principes dirigeants, je vais pouvoir rentrer dans la technique. Non, n'ayez pas peur, ça ne va pas faire mal !

Premier lancement de PowerShell[modifier | modifier le wikicode]

Windows[modifier | modifier le wikicode]

Il y a plusieurs possibilités, en voici une :

R

  • Maintenez la touche Windows (touche logo ou touche système) enfoncée !
  • Toujours en maintenant la touche Windows enfoncée, tapez R !

Le raccourci Win+R affiche la boîte de dialogue Exécuter.

  • Dans la boîte de dialogue Exécuter, tapez "powershell" puis frapper la touche retour ou entrée !

La fenêtre contenant la console PowerShell est apparue. Bienvenue dans un monde meilleur !

Linux[modifier | modifier le wikicode]

Il y a plusieurs possibilités, en voici une qui fonctionne sur Linux Mint :

CtrlAltT

  • Maintenez les touches Ctrl et Alt toutes deux enfoncées !
  • Toujours en maintenant les touches enfoncées, tapez T !

Le raccourci Ctrl+Alt+T démarre le shell de l'utilisateur (chez moi gnome-terminal).

  • Dans le terminal, tapez "pwsh" puis frapper la touche retour ou entrée !

L'invite de commande doit vous indiquer que vous êtes dans le PoWerSHell version Core !

Apparence[modifier | modifier le wikicode]

Comme pour les autres fenêtres, vous pouvez personnaliser l'affichage en augmentant la taille du texte par exemple :

  • Faites un clic droit en haut sur la barre de titre de l'application puis
  • Éditez les propriétés !

Quitter le shell[modifier | modifier le wikicode]

Comme pour les autres shell, la commande

exit

fermera le shell. Utilisez-la, c'est une bonne habitude :-)

Copier Coller[modifier | modifier le wikicode]

D'une façon similaire aux shells Unix et Linux, le texte est copié lorsque vous sélectionnez du texte avec la souris dans Powershell et que vous faites un clic-droit sur celui-ci. À l'inverse, le texte est collé lorsque vous faites un clic droit dans le PowerShell est qu'aucun texte n'est sélectionné !

Les Command-Lets[modifier | modifier le wikicode]

Command-Lets ? Commandlettes ? Kézaco ?
Aussi surnommées Cmdlets, ces commandes permettent de faire des actions dans PowerShell. Elles sont utilisées pour manipuler des objets. On peut les diviser en deux parties : [Verbe]-[Nom].
Le verbe correspond à l'action faite, le nom correspond à l'objet manipulé. Logique, non ?

Les 3 commandes qui vous sauveront la vie[modifier | modifier le wikicode]

Voici trois commandes bien utiles au début de votre carrière de PowerShelliste :

  • Get-Help

Get-Help affiche l'aide

Get-Help -Name Get-Item

affichera l'aide de la commandlette Get-Item.

En PowerShell, il y a des arguments par défaut aussi, vous pouvez omettre l'argument -Name comme suit :

Get-Help Get-Item
  • Get-Member

Get-Member affiche des informations sur un objet

Get-Member -InputObject 4

Au passage, remarquez que 4 n'est pas une lettre mais un System.Int32 soit un chiffre entier. Vous pourrez le comparer à d'autres chiffres, etc. Mais reprenons ...

En PowerShell, vous pouvez très souvent ignorer la casse et donc taper :

get-member -inputobject 4
  • Format-Table

Format-Table affiche les données sous forme de tableau (en chaîne de caractères)

Format-Table -InputObject (Get-Date)

Ouh là ... ça devient compliqué ! Nous allons simplifier cela ! Vous pouvez chaîner les commandes en utilisant le caractère | (pipe en anglais). Ceci permet d'éviter l'utilisation de l'argument -InputObject ! Les deux commandes ci-dessus deviennent :

4 | get-member

et

get-date | format-table

Pas besoin de maîtriser cela pour l'instant. Vous savez ce que c'est et ça suffira pour l'instant. Continuez simplement votre lecture et pratiquez !

« Help, I need somebody... »[modifier | modifier le wikicode]

  • Important

Ne demandez pas de l'aide tout de suite, continuez d'abord votre lecture ! Creusez !

  • Lien

Il existe plusieurs forums. En voici un qui me semble bien (actif en 2018) : http://powershell-scripting.com/index.php


Navigation

Maintenant que vous connaissez un peu mieux le principe de fonctionnement de PowerShell, abordons la navigation, ou comment s'y retrouver une fois dans la commande PowerShell. C'est bien joli de connaître les cmdlets ou de savoir le principe de la console, si on ne manipule rien et que l'on ne va nulle part. Dans ce chapitre sera traiter tout ce qui concerne les dossiers et les fichiers, que ce soit les parcourir, les créer, les modifier ou encore faire une recherche.

Un point sur le système de fichiers de Windows[modifier | modifier le wikicode]

Le système de fichiers c'est la manière d'écrire les données sur le média en l’occurrence sur votre disque dur ! De mon point de vue, vous n'avez pas besoin de rentrer dans les détails mais je vous mets un lien à tout hasard : NTFS. Ce que vous devez savoir :

  • vous pouvez créer une arborescence de dossiers, sous-dossiers qui contiennent des fichiers.
  • vous pouvez définir des permissions (ACLs) pour restreindre les accès, etc.

Où suis-je ? Comment puis-je naviguer ?[modifier | modifier le wikicode]

  • Get-Location
Get-Location

La commandlette Get-Location vous indique le répertoire courant. Pour vous déplacer dans la hiérarchie de dossiers, sous-dossiers. utilisez la commande suivante :

  • Set-Location
Set-Location c:\users

ce qui définira le dossier c:\users comme répertoire courant. Notez que vous n'êtes pas limité au lecteur C:\ ! Si vous avez une clef usb ou un disque dur externe, vous pouvez taper ceci par exemple :

Set-Location j:

Ouh laaa ... ça me gave de taper les chemins complet ! Là encore, PowerShell est un shell moderne et vous avez la complétion automatique à votre disposition. Procédez ainsi :

  • Tapez la commande soit Set-Location puis
  • Tapez le début du chemin soit c:\u
  • Frappez la touche TAB (tabulation) ce qui demande l’auto-complétion.

Si le chemin n'est pas le chemin voulu, frappez au temps de fois la touche TAB que nécessaire ! Quand le chemin correct est affiché, validez en frappant la touche retour ou entrée !

Lister[modifier | modifier le wikicode]

Pour afficher le contenu d'un dossier, tapez :

Get-ChildItem

Notez que vous pouvez utiliser les arguments -File et -Directory pour ne lister que les fichiers ou que les dossiers :

Get-ChildItem -File
Get-ChildItem -Directory

Bien qu'un peut compliquée si vous venez de commencer, je vous donne cette commande :

Get-ChildItem | Sort-Object -Property LastWriteTime

Ceci permet d'avoir les derniers fichiers modifiés ce qui peut être pratique.

Création et modification de fichiers[modifier | modifier le wikicode]

  • New-Item

La commande New-Item permet de créer des fichiers, dossiers et d'autres éléments que vous verrez plus tard ! Créer un fichier vide n'a guère de sens. Je vous donne donc la commandlette pour créer un sous-dossier :

New-Item -ItemType dir exemple

Remarquez que j'ai raccourci la valeur de l'argument. J'aurais pu écrire -ItemType Directory mais là aussi, PowerShell vous laisse être un peu paresseux.

  • création d'un fichier avec un contenu

Utilisez le pipe comme suit pour créer un fichier avec du contenu

1 > exemple.txt

Vous pouvez vérifier, la valeur 1 est écrite dans le fichier exemple.txt

notepad .\exemple.txt

Faisons de même pour du texte :

'bonjour le monde' > .\exemple.txt
"aujourd'hui c'est la fête !" >> .\exemple.txt

Retenez que le guillemet américain simple écrase le contenu et que le guillemet américain double met le contenu à la fin (mode append).

Lecture de fichier[modifier | modifier le wikicode]

Pour lire les 50 dernières lignes d'un gros fichier de logs :

Get-Content -Path var\log\dev.log -Tail 50

Pour en filtrer les lignes contenant une chaine (équivalent au grep Linux) :

Select-String -Path var\log\dev.log -Pattern "CRITICAL"

Mais où est Charlie ?[modifier | modifier le wikicode]

Pour l'instant, je ne trouve pas d'exemple pour démarrer une recherche Windows Search mais en théorie, ça doit être faisable

search-ms:query=fête&crumb=c:\your\path&

En revanche, voici deux commandlettes utilisables de suite :

Get-ChildItem "*fête*"

La commande ci-dessus listera les dossiers et les fichiers contenant le mot fête.

Get-ChildItem | Select-String "fête"

La commande ci-dessus listera les fichiers contenant le mot fête situés dans le dossier courant uniquement.

La commande ci-dessous fait de même mais en parcourant tous les sous-dossier ce qui peut prendre beaucoup de temps !

Get-ChildItem -Recurse | Select-String "fête"

La commande ci-dessus listera les fichiers contenant le mot fête dans le dossier courant et les sous-dossiers.

Attention toutefois, si la commande met trop de temps, vous pouvez l'arrêter avec la combinaison de touches ci-dessous :

CTRL + C 

Important : en appuyant simultanément sur les touches contrôle et C, vous arrêtez l'exécution du script !


Formatage de l'affichage

C'est en train de devenir intéressant

Un point sur les données dans PowerShell[modifier | modifier le wikicode]

Retenez bien que PowerShell est un shell objet. En bref, là ou les anciens shell manipulent des chaines de caractères, PowerShell manipule des objets du framework .NET

Formatage de l'affichage[modifier | modifier le wikicode]

Les objets manipulés par PowerShell ont une méthode ToString() qui se charge de noter la description ou la valeur de l'objet au format de chaînes de caractères. Cette méthode est parfois appelée automatiquement par PowerShell mais vous pouvez l'appeler explicitement aussi ! Prenons 12 qui est une valeur typée entier :

12 | get-member

En exécutant l'instruction ci-dessus, vous constatez qu'il est écrit TypeName : System.Int32

Ci-dessous, une commandlette pour afficher dans la console la valeur

Write-Host 12

Automatiquement, PowerShell fait ceci :

Write-Host (12).ToString()

Les types d'objet définissent un formatage par défaut et vous pouvez le constater avec une date :

# différents formats par défaut ...  
Get-Date
Write-Host (Get-Date).ToString()

Lorsque vous en aurez besoin, sachez simplement que vous pouvez modifier cela. Voici un exemple pour la date :

Write-Host (Get-Date).ToString("d MMMM yyyy")

La notion du type des données peut être déroutante lorsque vous débutez. Utilisez abusivement Get-Member pour identifier le type de données renvoyé par PowerShell !

Important[modifier | modifier le wikicode]

Dans la mesure du possible, travaillez avec des objets et non avec des chaines de caractères !

C'est la notion principale à retenir : avec PowerShell, on agit sur des objets du framework .NET et pas uniquement sur du texte comme les anciens shells !

Formatage de nombreuses données[modifier | modifier le wikicode]

Cela devient important lorsque vous traitez des listes par exemple avec

Get-Process

La commandlette ci-dessus renvoie une collection de zéro à beaucoup d'éléments typés System.Diagnostics.Process.

Vous pouvez l'afficher en version texte avec la commandlette suivante :

Get-Process | Format-Table -Property ProcessName, StartTime

La commandlette Format-Table renvoie des données formatées ! Elles n'ont plus leur type d'origine et donc, vous ne pouvez plus travailler les objets par la suite car la date StartTime est une chaîne de caractère suite au traitement de formatage. En résumé, les commandes de formatage sont à appliquer en fin de traitement.

Vous pouvez créer vos propres colonnes, etc. Mais je vous conseille d'ignorer tout cela car le but de PowerShell est de traiter les données et non du texte, vos fonctions et vos scripts devront renvoyer des objets et non du texte.


Les scripts

Nouvelle étape, créez un script ![modifier | modifier le wikicode]

Arrivé à ce stade, vous allez franchir une nouvelle étape à savoir : créer et exécuter un script PowerShell.

Un script PowerShell n'est rien d'autre qu'un fichier texte avec l'extension .ps1 ! Vous pourriez utiliser le bloc-notes de Windows pour créer et modifier vos scripts.

Microsoft vous fournit un outil pour le développement de scripts complet aussi utilisez-le :

  • PowerShell ISE

Pour les linuxiens et les utilisateurs avancés, vous pouvez utiliser un autre éditeur comme gedit, Sublime, VSCode [1] ou autres.

Il existe plusieurs façons pour démarrer PowerShell ISE. En voici une :

  • Utilisez le raccourci Win+R pour afficher la boîte de dialogue Exécuter comme décrit précédemment !
  • Tapez powershell_ise et validez en frappant la touche retour ou entrée !

Vous constaterez que l'outil est bien fait. Il y a trois parties :

  • la partie où vous éditez vos scripts (comme dans le bloc-notes mais avec la coloration syntaxique et l'auto-complétion)
  • la partie où vous pouvez taper des commande (comme dans le shell lui-même)
  • un volet latéral vous affichant les paramètres des commandes, etc.

Copiez le script ci-dessous en guise d'exemple dans la partie pour éditer les scripts :

$Heure = "Il est $((Get-Date).hour)h et $((Get-Date).minute) min."
if ((Get-Date).hour -le 18)
  {$Message = "Bonjour"}
else
  {$Message = "Bonsoir"}
Write-Host "$Message !`n$Heure"

puis enregistrez le script avec le raccourci CTRL+S ! Pour l'exemple, appelons-le coucou.ps1 !

Enfin, démarrer votre session de débogage avec F5 !

L'outil vous donne la possibilité de déboguer votre script en plaçant des points d'arrêt. Pour cela, cliquez sur la ligne concernée par exemple la première ligne puis tapez F9 !

Enfin, démarrez votre session de débogage avec F5 ! L'exécution sera mise en pause et vous pourrez reprendre avec F5 (Continue) ou passer à la prochaine ligne avec F10 (Step Over). F11 fait de même mais en s'arrêtant à l'intérieur des fonctions appelées par le code (Step Into) ! Maj+F11 revient dans le code principal (Step Out). Testez un peu est sachez que tout cela est disponible pour vous aider lorsque vous serez plus avancé.

Il est possible de voir la pile des appels avec CTRL+SHIFT+D et vous pouvez voir le contenu des variables en positionnant le pointeur de la souris sur la variable.

Quand vous estimez que le script est OK, enregistrez et fermez !

Nouvelle étape, utilisez un script[modifier | modifier le wikicode]

Ouvrez le shell et tapez simplement le nom du script :

./coucou.ps1

Voilà, vous avez la base ! Sachez que vous pouvez définir des paramètres pour influencer l'exécution du script ! Lorsque le code devient plus complexe, vous pouvez le découper en plusieurs fonctions ! Vous pouvez créer vos commandlettes personnelles et les enregistrer dans vos modules personnels, les transmettre à vos collègues !


Variables, constantes et alias

Les variables[modifier | modifier le wikicode]

En PowerShell, une variable est précédée par un dollar par exemple :

$age = 18

La variable age contient un chiffre entier : 18.

Il existe des notions de type de données, de portées des variables, de constantes en lecture seule, etc.

Pour l'instant, écrivez simplement vos variables juste avant de les utiliser ou au moment de les utiliser.

Ignorez le typage car PowerShell fournit un typage dynamique des données !

Ignorer les constantes !

Les alias[modifier | modifier le wikicode]

Au passage, je vous présente les alias ou du moins un alias :

gal

L'alias gal se réfère à la commandlette Get-Alias !

Dans un script, n'utilisez pas les alias ! Préférez les commandes complètes car elles seront plus lisibles pour vos relectures !

Les alias sont très pratiques lorsque vous utilisez le shell en tapant les commandes pour effectuer une tâche. Ils vous feront gagner du temps. Remarquez que les alias sont mentionnés par la commandlette Get-Help

help Get-ChildItem

vous dit qu'il y a trois alias : gci, ls ou dir ! Tous les trois sont parfaitement équivalents.


Tableaux

Les tableaux[modifier | modifier le wikicode]

Avoir une variable pour une donnée, c'est bien. Toutefois, vous aurez vite besoin d'une variable pour une collection de données.

En PowerShell, ceci est une variable qui référence un tableau de 3 entiers :

$tableau = 1,2,3

et vous accédez à chaque élément comme ceci :

$premiereVal = $tableau[0]
$derniereVal = $tableau[2]

De nombreuses commandlettes vous renverrons des tableaux, des collections qui vous pourrez parcourir !

Vous pouvez créer vos collections personnelles ainsi :

$col = @()

Et vous pouvez ajouter des éléments par la suite :

$col += 3

Ci-dessus, j'ajoute un entier dans une collection.

Lorsque vous verrez les boucles, vous verrez comment utiliser vos tableaux, collections, etc.


Redirections

Redirections[modifier | modifier le wikicode]

En PowerShell, les commandlettes exécutées affichent parfois des informations dans la console lors de l'exécution et il peut être utile de rediriger les sorties pour masquer ces messages.

C'est assez complexe aussi je ne vous donnerai que cette commande pour débuter :

  • Out-Null

Out-Null envoie le texte d'une commandlette dans le néant !

New-Item nouveau.txt | Out-Null

Normalement, l'utilisation typique d'une redirection se fait dans le shell. Ce peut être l'enregistrement des erreurs dans un fichier séparé par exemple :

  • 2>&1

2>&1 redirige le flux 2 (les erreurs) dans le flux 1 (les messages s'affichant en cas de succès)

.\script.ps1 2>&1 > C:\Temp\script.log

Peut-être en aurez-vous besoin un jour ? En attendant, poursuivez car vous n'avez pas besoin de maîtriser ceci au début !


Conditions

Les conditions[modifier | modifier le wikicode]

Pour donner vie à vos scripts, vous aurez besoin des conditions ou Statements en anglais.

La structure la plus simple est le SI ce qui donne ceci : si une condition est remplie, alors fais ceci sinon fais cela !

Cette structure s'appelle le IF STATEMENT. Pour utiliser cette structure, je vous conseille de procéder ainsi dans ISE :

  • Tapez CTRL+J pour afficher les snippets (bouts de code prêt à l'emploi) !
  • Tapez If puis ...
  • Frappez la touche retour ou entrée !

Le code est inséré. C'est bien pratique :-)

Voici un exemple :

$tableau = 1,2,3,4
if ($tableau.Count % 2 -eq 0)
{
    Write-Host "Le tableau contient un nombre pair de données ... "
}
else
{
    Write-Host "Le tableau contient un nombre impair de données ... "
}


Boucles

Utilisez aussi les snippets pour les boucles !

For[modifier | modifier le wikicode]

for($i=0; $i -le 5; $i++) {
    Write-Host "$i"
}

While[modifier | modifier le wikicode]

$i=0
while($i -le 5) {
    Write-Host "$i"
    $i++
}
 Il existe aussi do... while.


Switch

Les Switch[modifier | modifier le wikicode]

Comme pour le reste, utilisez les snippets (CTRL+J) !

$Heure = (Get-Date).hour
switch ($Heure) {
 18 { Write-Host "Il est dix-huit heures. "; break }
 Default { Write-Host "Ce n'est pas l'heure du crime ... " }
}


Les objets personnalisés

Les objets personnalisés[modifier | modifier le wikicode]

L'usage de PowerShell (ci-après PS) devient intéressant et réellement efficace lorsqu'on commence à créer ses propres objets. C'est la réelle plus-value d'un shell objet vs shell texte !

Retenez qu'il existe un type d'objet nommé PSCustomObject permettant de créer vos objets comme vous le voulez ! Vous allez pouvoir stocker les informations structurée selon vos besoin dans des collections (voir ou revoir la partie des tableaux).

Créer un objet[modifier | modifier le wikicode]

L'exemple ci-dessous vous montre comment créer un objet correspondant à vos besoins :

$myObject = New-Object -TypeName pscustomobject
$myObject | Add-Member -MemberType NoteProperty -Name 'ID' -Value '1'  
$myObject | Add-Member -MemberType NoteProperty -Name 'Inutile' -Value $true  
$myObject | Add-Member -MemberType NoteProperty -Name 'Name' -Value 'Alfonso'  
$myObject

Récupérer un objet ne contenant que ce dont on a besoin[modifier | modifier le wikicode]

L'exemple ci-dessous vous montre comment obtenir les propriétés désirées d'un objet comportant des dizaines de propriétés :

$obj = $myObject | Select-Object -Property Name, ID
$obj

Ajouter un objet à une collection[modifier | modifier le wikicode]

L'exemple ci-dessous vous montre comment ajouter vos objets dans une collection :

$obj2 = New-Object -TypeName pscustomobject
$obj2 | Add-Member -MemberType NoteProperty -Name 'Name' -Value 'Bertha'  
$obj2 | Add-Member -MemberType NoteProperty -Name 'ID' -Value 2  
$obj2
$maCollection = New-Object -TypeName System.Collections.ArrayList
$maCollection += $obj 
$maCollection += $obj2 
$maCollection

Boucler et enrichir la collection d'objets[modifier | modifier le wikicode]

Il est important de savoir ajouter, petit à petit des informations dans vos objets :

$maCollection | ForEach-Object { $_ | Add-Member -Type NoteProperty -Name 'NewThing' -Value 'NewValue' } 
# ou
$maCollection | ForEach-Object { $_ | Add-Member -Type NoteProperty 'NewThing2' 'NewValue2' } 
# ou
$maCollection | ForEach-Object { $_ | Add-Member 'NewThing3' 'NewValue3' } 
$maCollection

Il est utile de savoir ajouter des valeurs calculées dans vos objets :

$maCollection | ForEach-Object { $_ | Add-Member @{'idTime3'=($_.ID * 3)} }
# ou
$maCollection | ForEach-Object { $_ | Add-Member 'idTime3bis' ($_.ID * 6) }

Aller plus loin avec les objets[modifier | modifier le wikicode]

Il est possible d'ajouter des méthodes à vos objets, etc.


Fonctions

Les fonctions[modifier | modifier le wikicode]

Les fonctions permettent de coder plus proprement (clean code). Quand vous sentez que vous vous répétez, alors créez une fonction !

En PowerShell, fonctions et commandlettes ne sont pas équivalentes.

  • la fonction est destinée à être utilisée dans le même code c'est à dire dans votre script directement.
  • une commandlettes est destinées à être utilisée par des tiers ou par d'autres scripts !

Comme pour les autres structures, utilisez les snippets pour créer facilement votre fonction ! Vous verrez qu'une commandlette peut contenir plusieurs fonctions en interne si nécessaire.


Services

Les services et les processus[modifier | modifier le wikicode]

Les services sont des programmes sans interface qui fonctionnent en permanence en tâche de fonds. Par exemple :

  • WinRM est le service qui attend les connexions à distance en PowerShell
  • Spooler est le service qui attend les pages à imprimer

PowerShell fournit des commandes pour gérer les service comme par exemple pour redémarrer le spooler d'impression :

Get-Service spooler | Restart-Service

Les processus sont des programmes ou des bout de programmes qui s'exécutent et se terminent. Par exemple :

  • notepad est le bloc-notes Windows

PowerShell vous permet de démarrer des processus (avec interface graphique ou non) comme par exemple le bloc-note :

Start-Process notepad

Vous pouvez aussi trouver et arrêter un programme :

Get-Process notepad | Stop-Process

Vous pouvez donc créer vos lanceurs spécialisés composé d'un raccourci sur un script powershell qui démarre un exécutable par exemple.


Remote

Les accès distants[modifier | modifier le wikicode]

Remarque[modifier | modifier le wikicode]

De nombreuses commandlettes propose l'argument -ComputerName ce qui permet de démarrer une commande sur un PC distant sans devoir ouvrir une session. Par exemple :

Get-Service -ComputerName 'SUPER_PC'

Procédure[modifier | modifier le wikicode]

D'une façon similaire à SSH pour Unix / Linux, PowerShell peut être utilisé pour se connecter sur un autre poste de travail voir des milliers de machines d'un coup.

Bien entendu, vous devez avoir les permissions requises pour cela c'est à dire : - être Domain Admin - être Local Admin du PCs cible - ou avoir des permissions configurée par l'administrateur

Si tel est le cas, c'est très simple, vous créez une session, vous vous connectez et vous la fermez à la fin comme cela :

$host = SUPER_PC
$session = New-PsSession -Computername $host -Cred Get-Credientials
Enter-PsSession -Session $session

Vous travaillez à distance puis...

Exit-PsSession 
Remove-PsSession -Session $session

Je le note de tête alors n'hésitez pas à corriger en cas d'erreur !

Au passage, avec PowerShell Core (la version multi-système de PS), vous pouvez vous connecter sur des machines Linux :

$s = New-PSSession -HostName $hostname -UserName $username 

Le PowerShell Core permet de gérer un parc composé de machine fonctionnant sous des OS différents.

GFDL GFDL Vous avez la permission de copier, distribuer et/ou modifier ce document selon les termes de la licence de documentation libre GNU, version 1.2 ou plus récente publiée par la Free Software Foundation ; sans sections inaltérables, sans texte de première page de couverture et sans texte de dernière page de couverture.