Bienvenue dans votre cahier d'exercices PowerShell ! Ce guide vous aidera à apprendre et à pratiquer les concepts essentiels de PowerShell, en se concentrant sur PowerShell moderne et multiplateforme de Microsoft (version 7 et supérieures).
Qu'est-ce que PowerShell ?
Pourquoi utiliser PowerShell 7+ ?
Installation :
winget install Microsoft.PowerShellLancer PowerShell :
pwsh dans votre terminal.Vérifiez votre version : La variable $PSVersionTable contient des informations détaillées sur votre version de PowerShell.
$PSVersionTable
# Pour voir uniquement la version de PowerShell :
$PSVersionTable.PSVersion
Get-Process, Set-Item. Pour plus d'informations, voir Vue d’ensemble des cmdlets.Verbe-Nom (ex : Get-Help, Start-Service). Les verbes approuvés sont documentés ici.Exercice :
Lister tous les processus en cours d'exécution.
Get-Process
|$_ (ou $PSItem en PSv3+) représente l'objet actuel dans le pipeline.# En Mo, 100 Mo = 100 * 1024 * 1024 octets
Get-Process | Where-Object { $_.WS -gt (100MB) }
Les variables dans PowerShell commencent par un signe dollar ($). PowerShell est faiblement typé mais vous pouvez imposer un type. Plus d'infos sur about_Variables.
$maVariable = "Bonjour, PowerShell !"
Write-Output $maVariable
[int]$monNombre = 42
# $monNombre = "texte" # Ceci génèrerait une erreur car le type est contraint à [int]
Exercice :
Assignez votre nom à une variable et affichez-le dans une phrase.
Réponse indicative :
$monNom = "Claude"
Write-Output "Mon nom est $monNom."
# Ou en utilisant la substitution de chaîne :
"Mon nom est $($monNom.ToUpper()) et j'apprends PowerShell."
Get-Member (alias: gm) pour inspecter les propriétés et méthodes d'un objet. Voir Get-Member.
Get-Date | Get-Member
'Ceci est une chaîne' | Get-Member
Exercice :
Obtenez la liste des fichiers dans votre répertoire personnel ($HOME) et affichez leurs noms, tailles (en Ko) et date de dernière écriture.
Réponse indicative :
Get-ChildItem -Path $HOME -File | Select-Object Name, LastWriteTime, @{Name="Taille (Ko)"; Expression={$_.Length / 1KB}}
.ps1..\monscript.ps1 (le .\ est important pour spécifier le chemin).Set-ExecutionPolicy RemoteSigned -Scope CurrentUser (requiert parfois le lancement de PowerShell en tant qu'administrateur pour le premier Set-ExecutionPolicy au niveau machine ou policy).
Les scripts peuvent accepter des paramètres. Apprenez-en plus sur les paramètres avancés des fonctions et scripts.
# monscript.ps1
param (
[Parameter(Mandatory=$true, HelpMessage="Entrez un nom d'utilisateur.")]
[string]$Name,
[Parameter(Position=1)] # Ce paramètre peut être fourni par position
[int]$Age = 30 # Valeur par défaut
)
Write-Output "Bonjour, $Name ! Vous avez $Age ans."
# Appel : .\monscript.ps1 -Name "Utilisateur"
# Appel : .\monscript.ps1 -Name "Test" -Age 40
# Appel : .\monscript.ps1 "AutreNom" 25
Créez des blocs de code réutilisables. Les fonctions peuvent être simples ou avancées (avec des attributs de paramètres comme les scripts). Voir about_Functions.
function Get-FormattedGreeting {
[CmdletBinding()] # Rend la fonction "avancée", supporte -Verbose, -Debug etc.
param(
[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
[string]$Name
)
process { # Nécessaire pour ValueFromPipeline
"Bonjour et bienvenue, $Name !"
}
}
Get-FormattedGreeting -Name "Alice"
"Bob" | Get-FormattedGreeting
Utilisez les blocs try/catch/finally pour une gestion structurée des erreurs. Plus d'infos sur about_Try_Catch_Finally.
try {
# Code susceptible de générer une erreur. -ErrorAction Stop force une erreur "terminating"
Get-Content -Path "fichier_inexistant.txt" -ErrorAction Stop
} catch [System.IO.FileNotFoundException] {
Write-Warning "Le fichier spécifié n'a pas été trouvé : $($_.Exception.Message)"
} catch { # Capture toutes les autres erreurs
Write-Error "Une erreur inattendue s'est produite : $($_.Exception.Message)"
# $_ contient l'objet ErrorRecord
} finally {
Write-Output "Le bloc Finally est toujours exécuté, qu'il y ait eu une erreur ou non."
}
PowerShell Remoting (PSRP) permet d'exécuter des commandes sur des machines distantes.
Enable-PSRemoting -Force. Consultez Prérequis pour l'exécution à distance.# Exécution interactive sur une machine
Enter-PSSession -ComputerName Serveur01
# Exécuter un bloc de script spécifique
Invoke-Command -ComputerName Serveur01, Serveur02 -ScriptBlock {
Get-Service -Name 'WinRM'
Get-Culture
}
# Utiliser une session persistante
$session = New-PSSession -ComputerName Serveur01
Invoke-Command -Session $session -ScriptBlock { $env:COMPUTERNAME }
Remove-PSSession -Session $session
Pour l'automatisation, les Tâches planifiées PowerShell ou l'intégration avec des outils comme Azure Automation, Jenkins, etc., sont courantes.
Les modules sont des ensembles de cmdlets, fonctions, variables, etc., qui étendent les fonctionnalités de PowerShell.
Find-Module -Name "*Azure*" # Recherche des modules liés à Azure
Find-Module -Name PSScriptAnalyzer -Repository PSGallery
Plus d'infos sur Find-Module.
Install-Module -Name Az -Scope CurrentUser # Installe le module Azure Az pour l'utilisateur actuel
# Si vous voulez l'installer pour tous les utilisateurs (nécessite admin) :
# Install-Module -Name Pester -Scope AllUsers -Force
Plus d'infos sur Install-Module.
Import-Module -Name AzGet-Module -ListAvailable et Get-Module*.log dans un répertoire spécifié par l'utilisateur (avec une valeur par défaut au répertoire courant) et afficher leurs noms complets, tailles et la dernière fois qu'ils ont été modifiés.Get-Salutation qui accepte un paramètre $Nom (avec une valeur par défaut "Invité") et retourne une salutation appropriée ("Bonjour", "Bon après-midi", "Bonsoir") en fonction de l'heure actuelle de la journée, incluant le nom.Get-Service | Where-Object { $_.Status -eq 'Stopped' }
# Nom du script : Get-LastLines.ps1
[CmdletBinding()]
param(
[Parameter(Mandatory=$true, HelpMessage="Chemin complet du fichier à lire.")]
[string]$FileName
)
if (Test-Path -Path $FileName -PathType Leaf) {
Write-Host "Les 5 dernières lignes de '$FileName' :"
Get-Content -Path $FileName -Tail 5
} else {
Write-Error "Le fichier '$FileName' n'existe pas ou n'est pas un fichier."
}
# Nom du script: Find-LogFiles.ps1
[CmdletBinding()]
param(
[Parameter(HelpMessage="Répertoire où chercher les fichiers .log.")]
[string]$Path = (Get-Location).Path # Répertoire courant par défaut
)
if (Test-Path -Path $Path -PathType Container) {
Get-ChildItem -Path $Path -Filter *.log -File -Recurse |
Select-Object FullName, Length, LastWriteTime
} else {
Write-Error "Le répertoire '$Path' n'existe pas."
}
# Pour l'exécuter :
# .\Find-LogFiles.ps1
# .\Find-LogFiles.ps1 -Path "C:\Windows\Logs"
function Get-Salutation {
[CmdletBinding()]
param(
[string]$Nom = "Invité"
)
$heureActuelle = (Get-Date).Hour
$salutation = ""
if ($heureActuelle -lt 12) {
$salutation = "Bonjour"
}
elseif ($heureActuelle -lt 18) {
$salutation = "Bon après-midi"
}
else {
$salutation = "Bonsoir"
}
return "$salutation, $Nom !"
}
# Exemples d'utilisation :
Get-Salutation
Get-Salutation -Nom "Marie"
Continuez à pratiquer et consultez la documentation officielle de PowerShell pour en savoir plus ! Un bon point de départ est souvent Get-Help (par ex. Get-Help Get-ChildItem -Online) pour ouvrir la page de documentation la plus récente.