Académique Documents
Professionnel Documents
Culture Documents
avec PowerShell
I. Présentation
II. PowerShell : 15 commandes indispensables
o A. Get-Command
o B. Get-Help
o C. Get-Member
o D. Get-Process
o E. Get-Service
o F. Get-PSDrive
o G. Get-Content
o H. Get-ChildItem
o I. Set-Location
o J. Get-Item
o K. New-Item
o L. Remove-Item
o M. Get-Date
o N. Test-Path
o O. Test-Connection
III. Comment créer son premier script PowerShell ?
I. Présentation
Ces commandes sont à connaître pour débuter sereinement, car elles sont incontournables, et
par expérience, je sais qu'on les utilise fréquemment.
Je ne vais pas être exhaustif sur toutes les possibilités de chaque commande pour ne pas
rendre l'article imbuvable, le but étant de vous faire une première initiation pratique pour
chaque commande. Des liens supplémentaires seront ajoutés vers d'autres articles et vidéos
pour vous permettre d'approfondir.
La commande Get-Command a pour objectif de vous aider à trouver une commande qui
correspond à vos besoins. Sans aucun paramètre, elle retourne l'intégralité des commandes
disponibles sur une machine :
Get-Command
Ce qui donne lieu à une sortie, forcément, conséquente et pas très exploitable.
Avant d'aller plus loin, un petit rappel sur la manière dont est constitué le nom d'une
commande Powershell :
<Verbe>-<Nom>
La première partie est un verbe (Get, Set, Remove, etc...) et la deuxième partie est un
nom pour désigner quelque chose (Service, Process, ADUser, ADGroup, etc.).
Pour obtenir toutes les commandes disponibles sur votre machine et qui commencent par le
verbe "New", on utilisera :
Ainsi, on obtient facilement la liste des commandes qui vont permettre de manipuler les
services. Comme les verbes sont explicites, on peut facilement deviner que par exemple, la
commande Start-Service sert à démarrer un service. Quelques notions de base en anglais
pour connaître les mots de base, c'est forcément un plus...
Si l'on veut plutôt obtenir toutes les commandes qui ont le mot "service" dans le nom, on
utilisera le paramètre -Name à la place de -Noun, avec la notion de wildcard "*" :
On peut voir dans la sortie ci-dessous que des applications sont également présentes dans les
résultats.
En fait, les paramètres -Noun, -Name et -Verb supportent le wildcard. On aurait pu conserver
-Noun sans le remplacer par -Name, ce qui donne :
La commande ci-dessus va donner la même sortie qu'avec -Name à l'exception qu'il n'y aura
pas les applications dans les résultats.
Il faut savoir que l'on peut toujours filtrer un peu plus les résultats. Par exemple, on peut
afficher seulement les commandes du type "Cmdlet" :
Vous l'aurez compris, le cmdlet Get-Command est très pratique pour rechercher une
commande par soi-même ! ?
B. Get-Help
Une fois que l'on a repéré la commande qui nous intéresse grâce à Get-Command ou une autre
méthode, on va en toute logique se poser la question suivante : comment s'utilise cette
commande PowerShell ? C'est là qu'intervient le cmdlet "Get-Help" puisqu'il permet
d'obtenir de l'aide.
Note : avant d'utiliser Get-Help pour la première fois, je vous recommande d'ouvrir une
console PowerShell en tant qu'administrateur et d'exécuter la commande Update-Help pour
mettre à jour l'aide locale.
De base, la commande retourne une synthèse de l'aide. Si l'on veut obtenir des exemples
d'utilisation de la commande, nous devons faire :
On remarque que la commande Start-Service dispose d'un paramètre nommé -Name. Si l'on
veut en savoir plus sur ce paramètre, on peut consulter l'aide de cette façon :
La console PowerShell peut vous rediriger directement sur la page d'aide en ligne
correspondante à la commande que vous souhaitez. Cela est possible grâce au paramètre -
Online :
Pour finir sur l'aide, je vous livre une dernière astuce qui consiste à utiliser la fonction "help".
Elle fonctionne sur le même principe et permet d'utiliser facilement Out-GridView pour avoir
une sortie en mode graphique.
Pour explorer une commande, il y a le cmdlet "Get-Member" et son alias "gm" qui sont à
connaître. Cette commande va permettre d'obtenir tous les membres d'une commande, c'est-à-
dire toutes les propriétés et méthodes d'une commande.
Ou
<commande source> | gm
Get-Service | Get-Member
ou
Le résultat renvoyé par Get-Member pourra varier en fonction de la commande source, même
pour un même cmdlet, en fonction des paramètres utilisés.
Sur la copie d'écran ci-dessus, on peut voir une liste de méthode (actions) que l'on peut
utiliser, ainsi que des propriétés (valeurs). Par exemple, la méthode "Stop()" permettra
d'arrêter un service en utilisant Get-Service. À titre d'information, voici comment l'utiliser
pour arrêter un service :
De la même manière, on peut afficher les valeurs des propriétés que l'on souhaite. Pour cela,
on peut utiliser Format-List, Format-Table ou encore Select-Object. Voici un exemple où j'ai
sélectionné quelques propriétés de Get-Service retournée par Get-Member :
D. Get-Process
Lorsqu'il s'agit de récupérer la liste des processus actifs sur une machine, on s'oriente
naturellement vers le Gestionnaire des tâches, car il affiche en temps réel la liste des
processus actifs avec différentes informations :
La commande Get-Process va permettre de faire la même chose, à l'aide de PowerShell, son
exécution sans paramètre va lister les processus actifs à l'instant t :
Dans la sortie ci-dessus, le nom des colonnes sont des alias vers d'autres noms de propriétés.
La commande Get-Member que l'on a vu précédemment permet d'obtenir cette information :
Pour avoir une sortie qui se rapproche réellement du Gestionnaire des tâches, et notamment
avoir le nom de l'utilisateur qui est à l'origine de l'exécution du processus, on va ajouter le
paramètre -IncludeUserName
Get-Process -IncludeUserName
La colonne WS correspond à WorkingSet, ce qui indique en fait la consommation en RAM de
ce processus, ici en Mégaoctets. Tandis que la colonne CPU indique le temps d'utilisation du
processeur.
Avec la commande initiale (sans -IncludeUserName), la valeur est en octet. Ainsi, pour
obtenir la liste de tous les processus qui consomment au minimum 100 Mo de RAM, on
utilisera la valeur "100000000".
Si l'on recherche un processus spécifique en cours d'exécution, en lien avec un logiciel, par
exemple le navigateur Chrome et son processus "chrome", on peut affiner la commande :
La liste des propriétés disponibles avec la commande Get-Process est très longue. On peut,
par exemple, obtenir la date de création de chaque processus grâce à la propriété StartTime.
Grâce à la commande Get-Service, nous allons pouvoir récupérer des informations sur les
services présents sur la machine, ainsi que sur leur état et leur type de démarrage : utile pour
vérifier si un service est en cours d'exécution ou pour lister tous les services en cours
d'exécution. Une commande que l'on peut utiliser pour créer un script de supervision, par
exemple.
Sans paramètre, la commande va renvoyer tous les services avec plusieurs informations : le
statut, le nom du service et son nom d'affichage (tel qu'il est dans la console de gestion des
services).
Get-Service
Pour récupérer la liste de tous les services en cours d'exécution, on doit effectuer un filtre
avec Where car il n'y a pas de paramètres directement au sein de Get-Service pour réaliser ce
filtre. Le statut qui nous intéresse est "Running", car il correspond à l'état "En cours
d'exécution".
Enfin, pour obtenir l'état d'un statut spécifique, par exemple le service "Windows Update"
(qui a pour nom wuauserv), on pourra le cibler directement :
PowerShell contient des commandes supplémentaires pour gérer les services, notamment pour
arrêter un service (Stop-Service) ou démarrer un service (Start-Service).
F. Get-PSDrive
La commande Get-PSDrive permet de récupérer des informations sur les différents lecteurs
du système. Plusieurs types de lecteurs différents sont remontés par cette commande, et il y en
a deux particulièrement utiles :
Les lecteurs de type "FileSystem" correspondant à vos volumes montés sur votre
système, par exemple le volume "C" où Windows est installé, ou alors un lecteur
réseau connecté sur votre machine.
Les lecteurs de type "Registry" correspondent au Registre Windows, en l'occurrence
les ruches HKCU et HKLM
Pour chaque lecteur, on obtient son nom, sa racine, ainsi que l'espace utilisé et l'espace libre
lorsqu'il s'agit d'un espace de stockage. Il suffit d'exécuter la commande sans aucun paramètre
pour obtenir cette synthèse :
Get-PSDrive
Pour obtenir des informations seulement sur les lecteurs du fournisseur (Provider)
"FileSystem", c'est-à-dire les espaces de stockage, on utilisera cette commande :
G. Get-Content
Pour récupérer les premières lignes d'un fichier, on va utiliser le paramètre -TotalCount suivi
du nombre de lignes à récupérer, en partant du début :
Enfin, pour récupérer les dernières lignes d'un fichier, on va utiliser le paramètre -Tail suivi
du nombre de lignes à récupérer, en partant de la fin :
La commande Get-ChildItem (et son alias gci) permet de lister le contenu d'un dossier
en PowerShell. On peut lister le contenu d'un dossier spécifique en s'arrêtant au dossier cible,
mais on peut aussi lister le contenu de façon récursive : le dossier cible ainsi que le contenu de
tout ses sous-dossiers.
Si l'on exécute la commande Get-ChildItem dans une console, le contenu du répertoire dans
lequel on se situe sera listé. Sinon, on peut préciser le chemin vers un dossier grâce à -Path :
Pour ajouter de la récursivité (prendre en compte les sous-dossiers), nous devrons ajouter -
Recurse, comme ceci :
On peut aussi lister seulement les fichiers avec -File ou seulement les dossiers avec -
Directory :
Get-ChildItem -Directory
Ce cmdlet intègre trois paramètres particulièrement intéressants pour filtrer les résultats :
Ainsi, pour récupérer la liste de tous les fichiers PDF contenus dans un dossier, nous pouvons
faire :
Dans le même esprit, on peut exclure des résultats tous les fichiers JPG :
Pour filtrer sur plusieurs extensions de fichiers, je vous propose d'utiliser -Include. Il s'utilise
simplement, mais il y a une petite subtilité : il faut indiquer un wildcard à la fin du chemin
pour bien préciser que l'on filtre le contenu du dossier, sinon, le résultat sera vide à chaque
fois. Voici comment récupérer seulement les fichiers EXE et PDF :
I. Set-Location
Utile pour l'usage de la console PowerShell plus que pour les scripts directement, la
commande Set-Location est indispensable, car elle permet de se déplacer d'un dossier à un
autre. Autrement dit, elle correspond à la fameuse commande "cd" (Change Directory) que
l'on retrouve aussi sous Linux.
Par exemple, si l'on est dans le dossier "C:\Users" et que l'on veut se positionner dans le
dossier "C:\TEMP", on fera tout simplement :
Set-Location "C:\TEMP"
J. Get-Item
Get-Item est un peu dans le même esprit que Get-ChildItem sauf qu'il sert à récupérer des
informations sur un élément précis, notamment un dossier ou un fichier. Finalement, on
peut aussi lister le contenu d'un dossier courant grâce à la commande ci-dessous :
Get-Item *
Le fait d'indiquer le wildcard "*" permet de lister tous les éléments. L'idée, c'est plutôt de
cibler un fichier comme dans cet exemple avec "Teams.ps1" :
Get-Item "C:\TEMP\Teams.ps1"
Ensuite, on va lire les propriétés de cet objet, ce qui va permettre d'obtenir plein
d'informations pertinentes : nom, date de création, date de dernier accès, date de dernière
modification. Ce qui se traduit par la commande suivante :
Je ne veux pas aller trop loin, mais on peut coupler l'utilisation de Get-ChildItem et Get-Item
pour obtenir les mêmes informations par rapport à une liste de fichiers que l'on obtient via
Get-ChildItem. Avec un filtre sur les fichiers EXE, cela donne :
Même si, on peut faire la même chose avec Get-Item (comme souvent il y a plusieurs façons
de faire) :
La création d'un dossier ou d'un fichier passe par l'utilisation de la commande New-
Item. Cette commande sert aussi à créer des liens symboliques. Tout se joue au sein du
paramètre -ItemType, alors que le paramètre -Path sert à préciser le chemin de l'élément et -
Name son nom.
Set-Location C:\TEMP\PS\POWERSHELL
New-Item -Path . -Name "IT-Connect.txt" -ItemType File
La commande ci-dessus contient la valeur "." pour le chemin (-Path), ce qui permet de
spécifier le dossier courant. On pourrait même créer plusieurs fichiers en même temps, par
exemple un fichier "fichier1.txt" et "fichier2.txt" dans notre dossier créé précédemment :
L. Remove-Item
Remove-Item .\logiciel.exe
Pour supprimer un dossier ainsi que tout son contenu, y compris s'il a des sous-dossiers (à
manipuler avec précaution), on utilisera en complément les paramètres -Recurse et -Force :
Enfin, je vous propose un dernier exemple : supprimer tous les fichiers JPG qui se trouvent
dans un dossier :
Cette commande est souvent couplée à l'utilisation de Get-ChildItem comme avec Get-Item, et
elle sert aussi à supprimer des éléments dans le registre.
M. Get-Date
La commande Get-Date sert à récupérer la date et l'heure, sous différents formats. Très utile
dans les scripts, notamment pour la gestion de fichiers de logs, mais aussi pour comparer des
dates.
Get-Date
Le fait d'utiliser "hh" donne l'heure sur 12 heures (am/pm) alors que "HH", en majuscules
donc, donne l'heure au format 24 heures.
N. Test-Path
Comme je l'explique dans l'article dédié à Test-Path (voir lien ci-dessous), on peut tester
l'existence d'un fichier et sa date de dernière modification, pour voir si elle est "plus récente
que" (NewerThan) ou "plus ancienne que" (OlderThan) en précisant une date.
O. Test-Connection
Test-Connection 1.1.1.1
Si l'on veut réaliser seulement 1 ping, ce qui est pratique pour simplement tester la
connectivité vers une machine, on utilisera -Count suivi du nombre de ping à réaliser :
À l'inverse, si l'on veut que le ping soit continue et qu'il ne s'arrête pas automatiquement, on
précisera -Continuous :
Enfin, on peut facilement tester plusieurs hôtes : il suffit de séparer les cibles par une virgule :
L'outil tracert qui permet de déterminer l'itinéraire jusqu'à un hôte distant est repris par Test-
Connection. Il suffit de préciser le paramètre -Traceroute :