23/11/2024

PowerShell

15 commandes indispensables pour débuter avec PowerShell

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 :

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

6 commentaires sur “15 commandes indispensables pour débuter avec PowerShell

  • Bookmarked !
    Ce serait top d’avoir un autre tuto sur les commande powershell indispensable sur WinServ !

    Répondre
  • 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.

    Répondre
    • 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

      Répondre
      • 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

        Répondre
  • 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

    Répondre
  • 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

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.