Programmation PowerShell/Version imprimable
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
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
modifierPowerShell 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
modifierPour 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
modifierAutomatiser 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
modifierSur 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
modifierWindows
modifierIl 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
modifierIl 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
modifierComme 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
modifierComme pour les autres shell, la commande
exit
fermera le shell. Utilisez-la, c'est une bonne habitude :-)
Copier Coller
modifierD'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
modifierCommand-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
modifierVoici 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- 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
modifierLe 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- 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
modifierPour 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- 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
modifierPour 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 ?
modifierPour 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
modifierRetenez 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
modifierLes 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
modifierDans 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
modifierCela 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 !
modifierArrivé à 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
modifierOuvrez 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
modifierEn 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
modifierAu 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
modifierAvoir 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
modifierEn 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
modifierPour 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
modifierfor($i=0; $i -le 5; $i++) {
Write-Host "$i"
}
While
modifier$i=0
while($i -le 5) {
Write-Host "$i"
$i++
}
do... while
.
Switch
Les Switch
modifierComme 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
modifierL'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
modifierL'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
modifierL'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
modifierL'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
modifierIl 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
modifierIl est possible d'ajouter des méthodes à vos objets, etc.
Fonctions
Les fonctions
modifierLes 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
modifierLes 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
modifierRemarque
modifierDe 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
modifierD'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 | 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. |