Aide-mémoire PowerShell
Bases et Concepts
ObjectifCommande
Aide sur une commande Get-Help Get-Process
Get-Help Get-Process -Examples
Get-Help Get-Process -Full
Update-Help  :: mettre à jour l'aide
Découvrir les cmdlets Get-Command
Get-Command -Verb Get
Get-Command -Noun Process
Get-Command *network*
Get-Alias ls  :: voir l'alias d'une commande
Membres d'un objet Get-Process | Get-Member
Get-Process | Get-Member -MemberType Property
"bonjour" | Get-Member
Version et profil $PSVersionTable
$PROFILE                     :: chemin du profil
notepad $PROFILE            :: éditer le profil
. $PROFILE                  :: recharger le profil
Politique d'exécution Get-ExecutionPolicy
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Set-ExecutionPolicy Bypass -Scope Process :: temporaire
Variables et Types
Déclarer et utiliser $nom = "Jean"
$age = 42
$prix = 3.14
$actif = $true
$vide = $null
Write-Host "Bonjour $nom, tu as $age ans"
Typage explicite [string]$nom = "Jean"
[int]$age = 42
[double]$prix = 3.14
[bool]$actif = $true
[datetime]$date = "2026-01-01"
[array]$tab = @(1,2,3)
[hashtable]$dico = @{}
Variables automatiques utiles $_           :: objet courant dans le pipeline
$?           :: succès de la dernière commande ($true/$false)
$LASTEXITCODE :: code retour du dernier programme externe
$Error[0]    :: dernière erreur
$PSScriptRoot :: dossier du script en cours
$args        :: arguments du script
$env:PATH    :: variable d'environnement
Portée (Scope) $global:maVar = "globale"
$script:maVar = "script"
$local:maVar  :: portée locale (par défaut)
Chaînes de Caractères
Déclaration "double guillemets - interpolation : $nom"
'simple guillemets - littéral : $nom'
@"
Ici-doc multiligne
avec $interpolation
"@
@'
Ici-doc littéral
'@
Méthodes courantes $s = "Bonjour Monde"
$s.Length         :: 13
$s.ToUpper()     :: BONJOUR MONDE
$s.ToLower()     :: bonjour monde
$s.Trim()        :: supprimer espaces
$s.Replace("Monde","World")
$s.Split(" ")    :: tableau de mots
$s.Contains("Bon") :: $true
$s.StartsWith("Bon")
$s.EndsWith("nde")
$s.IndexOf("Monde") :: 8
$s.Substring(0, 7)  :: Bonjour
Formatage "Prix : {0:N2} €" -f 1234.5  :: Prix : 1 234,50 €
"{0:D}" -f (Get-Date)       :: date longue
"{0:yyyy-MM-dd}" -f (Get-Date)
$s.PadLeft(10)             :: aligner à droite
$s.PadRight(10, '-')       :: rembourrer
Tableaux et Hashtables
Tableaux $t = @(1, 2, 3, 4)
$t = 1..10                 :: plage 1 à 10
$t[0]                      :: premier élément
$t[-1]                     :: dernier élément
$t.Count                   :: nombre d'éléments
$t += 5                    :: ajouter un élément
$t -contains 3            :: $true
$t | Sort-Object
$t | Sort-Object -Descending
$t | Where-Object { $_ -gt 5 }
$t | ForEach-Object { $_ * 2 }
$t | Measure-Object -Sum -Average -Min -Max
Tableaux génériques (ArrayList) $list = [System.Collections.Generic.List[string]]::new()
$list.Add("un")
$list.Add("deux")
$list.Remove("un")
$list.Count
Hashtables $h = @{ nom = "Jean"; age = 42 }
$h["nom"]          :: Jean
$h.nom             :: Jean
$h["ville"] = "Paris" :: ajouter
$h.Remove("age")   :: supprimer
$h.ContainsKey("nom") :: $true
$h.Keys            :: toutes les clés
$h.Values          :: toutes les valeurs

:: Ordonné
$h = [ordered]@{ a=1; b=2; c=3 }
Conditions et Comparaisons
Opérateurs de comparaison -eq  :: égal
-ne  :: différent
-gt  :: plus grand
-ge  :: plus grand ou égal
-lt  :: plus petit
-le  :: plus petit ou égal
-like "A*"    :: wildcard
-notlike
-match "regex" :: regex
-notmatch
-contains     :: tableau contient valeur
-in           :: valeur dans tableau
-and -or -not -xor
If / ElseIf / Else if ($age -ge 18) {
  Write-Host "Majeur"
} elseif ($age -ge 16) {
  Write-Host "Presque"
} else {
  Write-Host "Mineur"
}
Switch switch ($jour) {
  "Lundi" { Write-Host "Début semaine" }
  "Samedi" { Write-Host "Weekend" }
  "Dimanche" { Write-Host "Weekend" }
  default { Write-Host "Semaine" }
}

switch -Wildcard ($fichier) {
  "*.log" { "journal" }
  "*.txt" { "texte" }
}
Opérateur ternaire (PS 7+) $result = $age -ge 18 ? "Majeur" : "Mineur"
Boucles
ForEach-Object (pipeline) Get-Process | ForEach-Object { Write-Host $_.Name }
Get-Process | ForEach-Object { $_.Name }  :: raccourci
1..5 | ForEach-Object { $_ * 2 }
foreach (rapide sur collections) foreach ($item in $tableau) {
  Write-Host $item
}

foreach ($key in $hash.Keys) {
  Write-Host "$key = $($hash[$key])"
}
for for ($i = 0; $i -lt 10; $i++) {
  Write-Host $i
}
while / do-while while ($i -lt 5) { $i++; Write-Host $i }

do {
  $i++
} while ($i -lt 5)

do {
  $i++
} until ($i -ge 5) :: until = tant que condition fausse
Contrôle de flux break    :: sortir de la boucle
continue :: passer à l'itération suivante
return   :: sortir de la fonction
exit 0   :: quitter le script
Fonctions
Fonction simple function Dire-Bonjour {
  param($nom)
  Write-Host "Bonjour $nom"
}
Dire-Bonjour -nom "Jean"
Paramètres avancés function Get-Info {
  [CmdletBinding()]
  param(
    [Parameter(Mandatory=$true)]
    [string]$Nom,

    [Parameter()][int]$Age = 0,

    [switch]$Verbose
  )
  if ($Verbose) { Write-Host "Mode verbose" }
  return "$Nom a $Age ans"
}
Pipeline input function Doubler {
  param([Parameter(ValueFromPipeline=$true)]$val)
  process { $val * 2 }
}
1..5 | Doubler
Pipeline et Filtrage
Where-Object Get-Process | Where-Object { $_.CPU -gt 100 }
Get-Process | Where-Object Name -like "chrome*"
Get-Service | Where-Object Status -eq "Running"
Select-Object Get-Process | Select-Object Name, CPU, Id
Get-Process | Select-Object -First 5
Get-Process | Select-Object -Last 5
Get-Process | Select-Object -Unique Name
Get-Process | Select-Object Name,@{n='CPU(s)';e={$_.CPU}}
Sort-Object / Group-Object Get-Process | Sort-Object CPU -Descending
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10
Get-Process | Group-Object Name
Mesures Get-Process | Measure-Object CPU -Sum -Average -Min -Max
(Get-ChildItem -Recurse | Measure-Object Length -Sum).Sum / 1MB
Tee-Object Get-Process | Tee-Object -FilePath procs.txt | Where-Object CPU -gt 100
Fichiers et Dossiers
Navigation Get-Location      :: pwd
Set-Location C:\temp :: cd
Push-Location C:\temp
Pop-Location
Lister Get-ChildItem        :: ls / dir
Get-ChildItem -Recurse
Get-ChildItem *.log
Get-ChildItem -Filter "*.txt" -Recurse
Get-ChildItem -Hidden
Get-ChildItem | Sort-Object LastWriteTime -Descending
Lire / écrire Get-Content fichier.txt
Get-Content fichier.txt | Select-String "erreur"
Set-Content fichier.txt "contenu"     :: écraser
Add-Content fichier.txt "nouvelle ligne" :: ajouter
$data = Get-Content fichier.txt -Raw  :: texte brut

:: Écrire de l'UTF-8
Set-Content fichier.txt "texte" -Encoding UTF8
Copier / déplacer / supprimer Copy-Item source dest
Copy-Item C:\src C:\dst -Recurse
Move-Item source dest
Remove-Item fichier.txt
Remove-Item dossier -Recurse -Force
New-Item -ItemType File -Name "test.txt"
New-Item -ItemType Directory -Name "mondossier"
Test d'existence Test-Path fichier.txt             :: $true/$false
Test-Path C:\dossier -PathType Container
Test-Path C:\fichier -PathType Leaf
Propriétés d'un fichier $f = Get-Item fichier.txt
$f.Name
$f.FullName
$f.Length                :: taille en octets
$f.LastWriteTime
$f.Extension
$f.BaseName             :: sans extension
JSON et CSV # JSON
$data = Get-Content data.json | ConvertFrom-Json
$data | ConvertTo-Json | Set-Content out.json
$data | ConvertTo-Json -Depth 5

# CSV
Import-Csv data.csv
Import-Csv data.csv -Delimiter ";"
Get-Process | Export-Csv procs.csv -NoTypeInformation
Get-Process | Export-Csv procs.csv -Delimiter ";" -Encoding UTF8
Chemins Join-Path "C:\dossier" "fichier.txt"
Split-Path "C:\dossier\fichier.txt" -Leaf     :: fichier.txt
Split-Path "C:\dossier\fichier.txt" -Parent  :: C:\dossier
[System.IO.Path]::GetExtension("f.txt")     :: .txt
[System.IO.Path]::GetTempPath()
Processus et Services
Processus Get-Process
Get-Process chrome
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10
Stop-Process -Name notepad
Stop-Process -Id 1234 -Force
Start-Process notepad
Start-Process "C:\prog.exe" -ArgumentList "/arg1","/arg2"
Start-Process cmd -Verb RunAs :: élever en admin
Wait-Process -Name "setup" -Timeout 60
Services Get-Service
Get-Service wuauserv
Get-Service | Where-Object Status -eq "Running"
Start-Service wuauserv
Stop-Service wuauserv
Restart-Service wuauserv
Set-Service -Name wuauserv -StartupType Automatic
Réseau
Informations réseau Get-NetIPAddress
Get-NetIPAddress -AddressFamily IPv4
Get-NetAdapter
Get-NetAdapter | Where-Object Status -eq "Up"
Get-DnsClientServerAddress
Resolve-DnsName google.com
Connectivité Test-Connection google.com
Test-Connection google.com -Count 4
Test-NetConnection google.com -Port 443
Test-NetConnection 192.168.1.1 -Port 22 :: tester un port
Web / HTTP Invoke-WebRequest "https://api.exemple.com"
$r = Invoke-WebRequest "https://api.exemple.com"
$r.StatusCode
$r.Content

# API REST JSON
$r = Invoke-RestMethod "https://api.exemple.com/users"
$r | Select-Object name, email

# POST JSON
$body = @{ nom = "Jean" } | ConvertTo-Json
Invoke-RestMethod "https://api/users" -Method POST -Body $body -ContentType "application/json"

# Télécharger un fichier
Invoke-WebRequest "https://url/fichier.zip" -OutFile "C:\fichier.zip"
Registre Windows
Navigation dans le registre Get-ChildItem HKLM:\SOFTWARE\Microsoft
Get-Item "HKCU:\Software\monapp"
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion"
Lire / écrire Get-ItemPropertyValue "HKCU:\Software\monapp" -Name "MaCle"

New-Item "HKCU:\Software\monapp" -Force
Set-ItemProperty "HKCU:\Software\monapp" -Name "MaCle" -Value "valeur"
New-ItemProperty "HKCU:\Software\monapp" -Name "Num" -Value 1 -PropertyType DWORD

Remove-ItemProperty "HKCU:\Software\monapp" -Name "MaCle"
Remove-Item "HKCU:\Software\monapp" -Recurse
Remoting et Jobs
Session distante Enter-PSSession -ComputerName serveur
Enter-PSSession -ComputerName serveur -Credential dom\user
Exit-PSSession

Invoke-Command -ComputerName serveur -ScriptBlock { Get-Service }
Invoke-Command -ComputerName srv1,srv2 -ScriptBlock { hostname }
Jobs en arrière-plan $job = Start-Job { Start-Sleep 10; "terminé" }
Get-Job
Wait-Job $job
Receive-Job $job
Remove-Job $job

# Parallel (PS 7+)
1..10 | ForEach-Object -Parallel { $_ * 2 } -ThrottleLimit 5
Gestion des Erreurs
Try / Catch / Finally try {
  Get-Item "C:\inexistant" -ErrorAction Stop
} catch [System.IO.FileNotFoundException] {
  Write-Warning "Fichier non trouvé"
} catch {
  Write-Error "Erreur : $_"
} finally {
  Write-Host "Terminé"
}
ErrorAction $ErrorActionPreference = "Stop"        :: globalement
Get-Item "C:\nx" -ErrorAction Stop   :: cette commande
Get-Item "C:\nx" -ErrorAction SilentlyContinue :: ignorer
Get-Item "C:\nx" -ErrorAction Continue :: continuer (défaut)
Write-* (sortie) Write-Host "Affichage console (sans pipeline)"
Write-Output "Dans le pipeline"
Write-Warning "Avertissement"
Write-Error "Erreur"
Write-Verbose "Détail"  :: visible avec -Verbose
Write-Debug "Debug"   :: visible avec -Debug
Write-Progress -Activity "Traitement" -PercentComplete 50
Modules
Gestion des modules Get-Module
Get-Module -ListAvailable
Import-Module ActiveDirectory
Remove-Module ActiveDirectory

Find-Module PowerShellGet  :: chercher sur PSGallery
Install-Module Pester     :: installer (admin requis)
Update-Module Pester
Uninstall-Module Pester
Modules utiles ActiveDirectory   :: gestion AD
DnsClient        :: DNS
NetTCPIP         :: réseau Windows
SqlServer        :: SQL Server
Az               :: Azure
Pester           :: tests unitaires
PSWindowsUpdate  :: Windows Update