15 commandes indispensables pour débuter avec PowerShell
Sommaire
I. Présentation
Dans ce nouvel article, je vais vous présenter 15 commandes PowerShell qu'il est indispensable de connaître pour débuter ! Cet article est dans la continuité de celui qui s'intitule "Comment créer son premier script PowerShell ?".
Tutoriel à suivre au format vidéo :
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.
II. PowerShell : 15 commandes indispensables
A. Get-Command
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.).
La commande Get-Command va permettre de rechercher une commande en filtrant par rapport au verbe, au nom ou à l'intégralité du nom de la commande. C'est plus intéressant si l'on affine la recherche.
Pour obtenir toutes les commandes disponibles sur votre machine et qui commencent par le verbe "New", on utilisera :
Get-Command -Verb New
Ensuite, prenons un autre cas, par exemple, pour trouver toutes les commandes qui ont le nom "Services", on utilisera :
Get-Command -Noun Service
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 "*" :
Get-Command -Name *Service*
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 :
Get-Command -Noun *Service*
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" :
Get-Command -Name *Service* -CommandType Cmdlet
Enfin, on peut obtenir la liste de toutes les commandes d'un module spécifique. Par exemple, toutes les commandes du module Active Directory :
Get-Command -Module ActiveDirectory
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.
Prenons l'exemple du cmdlet "Start-Service" évoqué précédemment (et choisi au hasard en fait) :
Get-Help Start-Service
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 :
Get-Help Start-Service -Examples
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 :
Get-Help Start-Service -Parameter Name
L'accès complet à l'aide est possible grâce au paramètre -Full où l'on aura la description de la commande, le détail de chaque paramètre, les exemples, etc.
Get-Help Start-Service -Full
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 :
Get-Help Start-Service -Online
Get-Help est une commande à connaître et personnellement, si j'ai un accès à Internet je privilégie l'utilisation de l'aide en ligne sur le site de Microsoft.
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.
Voyez par vous-même en essayant la commande ci-dessous :
help Start-Service -Full | Out-GridView
C. Get-Member
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.
Cette commande s'utilise de cette façon :
<commande source> | Get-Member
Ou
<commande source> | gm
La commande source sera une commande complète ou incomplète, c'est-à-dire seulement un nom de commande ou un nom de commande avec des paramètres et valeurs. Pour que ce soit plus parlant :
Get-Service | Get-Member
ou
Get-Service -Name wuauserv | Get-Member
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 :
(Get-Service -Name wuauserv).stop()
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 :
Get-Service -Name wuauserv | Format-Table Status, StartType, MachineName, DisplayName
Les commandes Get-Command et Get-Help sont très utiles pour débuter et moins par la suite quand on maîtrise un bon nombre de commandes. Même si on les réutilise souvent, finalement. Par contre, la commande Get-Member est utile "tout le temps" pour explorer les méthodes et propriétés des commandes, car c'est très vaste.
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 :
Name MemberType Definition ---- ---------- ---------- Handles AliasProperty Handles = Handlecount Name AliasProperty Name = ProcessName NPM AliasProperty NPM = NonpagedSystemMemorySize64 PM AliasProperty PM = PagedMemorySize64 SI AliasProperty SI = SessionId VM AliasProperty VM = VirtualMemorySize64 WS AliasProperty WS = WorkingSet64
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".
Get-Process | Where-Object { $_.WorkingSet -ge 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 :
Get-Process -Name "chrome" -IncludeUserName
Ou, tout simplement :
Get-Process -Name "chrome"
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.
Get-Process | Format-Table Name, StartTime
E. Get-Service
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".
Get-Service | Where-Object {$_.status -eq "Running"}
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 :
Get-Service -Name "wuauserv"
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).
⭐ Guide complet sur l'utilisation de Get-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 :
Get-PSDrive -PSProvider FileSystem
G. Get-Content
La commande Get-Content sert à récupérer le contenu d'un fichier, simplement pour l'afficher ou pour l'exploiter dans un script complet. Son utilisation est simple puisqu'il suffit de spécifier le nom d'un fichier à charger :
Get-Content -Path "<chemin-du-fichier>" Get-Content -Path "C:\TEMP\Pays.txt"
La commande ci-dessus va récupérer l'intégralité du fichier.
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 :
Get-Content "C:\TEMP\Pays.txt" -TotalCount 5
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 :
Get-Content "C:\TEMP\Pays.txt" -Tail 5
⭐ Guide complet sur l'utilisation de Get-Content
H. Get-ChildItem
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 :
Get-ChildItem -Path "C:\TEMP"
Pour ajouter de la récursivité (prendre en compte les sous-dossiers), nous devrons ajouter -Recurse, comme ceci :
Get-ChildItem -Path "C:\TEMP" -Recurse
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 : -Filter, -Include et -Exclude.
Ainsi, pour récupérer la liste de tous les fichiers PDF contenus dans un dossier, nous pouvons faire :
Get-ChildItem -Path "C:\TEMP" -Filter "*.pdf"
Dans le même esprit, on peut exclure des résultats tous les fichiers JPG :
Get-ChildItem -Exclude *.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 :
Get-ChildItem "C:\TEMP\*" -Include *.exe,*.pdf
Enfin, sachez que Get-ChildItem sert également à lister le contenu du Registre Windows. Par exemple, la ruche HKLM correspondante à HKEY_LOCAL_MACHINE :
Get-ChildItem -Path HKLM:\SYSTEM
⭐ Cas d'usage : comment lister les dossiers vides en PowerShell ?
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"
Le chemin que l'on indique sera automatiquement associé au paramètre -Path.
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 :
Get-Item "C:\TEMP\Teams.ps1" | Select-Object Name, CreationTime, LastAccessTime, LastWriteTime
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 :
Get-ChildItem -Filter *.exe | Get-Item | Select-Object Name, CreationTime, LastAccessTime, LastWriteTime
Même si, on peut faire la même chose avec Get-Item (comme souvent il y a plusieurs façons de faire) :
Get-Item *.exe | Select-Object Name, CreationTime, LastAccessTime, LastWriteTime
Pour réaliser du reporting ou de la surveillance sur des éléments, la commande Get-Item est redoutable !
K. New-Item
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.
Commençons par créer un dossier nommé "POWERSHELL" dans le dossier "C:\TEMP" :
New-Item -Path "C:\TEMP\PS" -Name "POWERSHELL" -ItemType Directory
Déplaçons-nous dans ce dossier avec Set-Location (vu précédemment) et créons un nouveau fichier TXT :
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 :
New-Item -ItemType File -Path "C:\TEMP\PS\POWERSHELL\FICHIER1.TXT", "C:\TEMP\PS\POWERSHELL\FICHIER2.TXT"
L. Remove-Item
À l'inverse de la commande précédente, Remove-Item sert à supprimer un élément, que ce soit un fichier ou un dossier.
Pour supprimer un fichier, c'est tout simple, on spécifie son nom :
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 :
Remove-Item "C:\TEMP\DossierCible\ -Recurse -Force
Enfin, je vous propose un dernier exemple : supprimer tous les fichiers JPG qui se trouvent dans un dossier :
Remove-Item "C:\TEMP\PS\*" -Include *.jpg
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
On peut obtenir la date sous la forme "AnnéeMoisJour" :
Get-Date -Format "yyyyMMdd" 20210319
De la même façon, en modifiant l'ordre et en ajoutant un "/" entre chaque partie :
Get-Date -Format "dd/MM/yyyy" 19/03/2021
Enfin, on pourrait inclure à la fin l'heure :
Get-Date -Format "yyyyMMdd_hhmm"
20210326_1131
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.
Pour en savoir plus sur l'utilisation de ce cmdlet :
⭐ Guide complet sur l'utilisation de Get-Date
N. Test-Path
Le cmdlet Test-Path sert à tester l'existence d'un élément, généralement un fichier ou un dossier. Par exemple pour tester l'existence du chemin "C:\TEMP", on exécutera :
Test-Path -Path "C:\TEMP"
La commande ne retournera pas le contenu du dossier ou ses propriétés, simplement une valeur booléenne : vraie ou faux. Simple, mais tellement pratique !
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.
⭐ PowerShell : le guide pour utiliser Test-Path
O. Test-Connection
Pour finir, je souhaitais vous parler de Test-Connection : l'équivalent de l'éternelle commande "ping", mais à la façon de PowerShell. Pour réaliser 4 pings à destination d'une machine, on peut spécifier son adresse IP ou son nom DNS :
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 :
Test-Connection 1.1.1.1 -Count 1
À l'inverse, si l'on veut que le ping soit continue et qu'il ne s'arrête pas automatiquement, on précisera -Continuous :
Test-Connection 1.1.1.1 -Continuous
Enfin, on peut facilement tester plusieurs hôtes : il suffit de séparer les cibles par une virgule :
Test-Connection 1.1.1.1, www.google.fr -Count 1
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 :
Test-Connection www.google.fr -Traceroute
⭐ A découvrir aussi pour tester des ports : Test-NetConnection
III. Comment créer son premier script PowerShell ?
En complément, je vous invite à lire mon article sur la création de son premier script PowerShell. Disponible en version vidéo directement :
Bookmarked !
Ce serait top d’avoir un autre tuto sur les commande powershell indispensable sur WinServ !
Merci, très sympa. Comme tous vos articles.
Comment obtenir la liste des méthodes et des propriétés d’une commande telle que Get-Item ou Set-Vm ?
Get-Item | Get-Command
Get-Vm | Get-Command
Ce genre de commandes attendent un paramètre et par conséquent Get-Command et n’affiche pas les membres de ces commandes.
Hello JBL 🙂
Pour Get-VM, tu peux utiliser simplement ceci : « Get-VM | Get-Member » et non Get-Command.
Pour la seconde, il faut effectivement préciser un chemin pour obtenir quelque chose, par exemple : Get-Item -Path « C:\ » | Get-Member
Tout dépend des commandes en fait, parfois il faut impérativement préciser un paramètre.
Bonne journée
Florian
Merci d’avoir corrigé, je voulais bien parler de « cmd | Get-Member » et non Get-Command.
Merci pour la dispo et toute bonne journée.
JBL
Salut et merci ! Tes explications sont très claires et donnent envie d’aller plus loin avec .PS1 alors que je suis un vieux DOS man
MERCI tes explication sont bien claire et aussi avec la pratique merci de faire une autre video
dans mon pc il n y a pas la touche I comment faire pour obtenir