1. Concepts Clés de PowerShell
- Cmdlets (Command-lets) : Petites commandes suivant la convention
Verbe-Nom(ex:Get-Help,Set-Location). - Objets : PowerShell ne manipule pas du texte brut comme les shells traditionnels, mais des objets .NET. Chaque sortie de commande est un objet avec des propriétés et des méthodes.
- Pipeline (
|) : Permet de chaîner les commandes. La sortie (objets) d'une commande devient l'entrée de la suivante. - Providers : Permettent d'accéder à différents magasins de données (système de fichiers, registre, variables d'environnement, certificats) de manière unifiée, comme s'il s'agissait de lecteurs de disque (ex:
C:,HKLM:,Env:,Cert:). - Alias : Noms courts pour les cmdlets (ex:
lspourGet-ChildItem,cdpourSet-Location). Pratiques en interactif, mais il est recommandé d'utiliser les noms complets dans les scripts pour la lisibilité.
2. Obtenir de l'Aide
Les commandes les plus importantes pour apprendre PowerShell.
Get-Help
Affiche l'aide pour une commande.
Get-Help Get-Process
Get-Help Get-Process -Examples
Get-Help Get-Process -Full
Get-Help Get-Process -Online
Get-Help about_* # Sujets conceptuels (ex: Get-Help about_Operators)
Update-Help
Télécharge les fichiers d'aide les plus récents (à exécuter en tant qu'administrateur).
Get-Command
Liste les commandes disponibles.
Get-Command *Service*
Get-Command -Noun Process
Get-Command -Verb Get
Get-Member (alias gm)
Montre les propriétés et méthodes des objets retournés par une commande.
Get-Process | Get-Member
"Bonjour" | Get-Member
4. Manipulation de Fichiers et Dossiers
New-Item -ItemType
New-Item -Path C:\Temp\MonDossier -ItemType Directory
New-Item -Path C:\Temp\MonFichier.txt -ItemType File
New-Item -Path C:\Temp\AutreFichier.txt -ItemType File -Value "Contenu initial"
Remove-Item (alias rm, del, rd, ri)
Remove-Item C:\Temp\MonFichier.txt
Remove-Item C:\Temp\MonDossier -Recurse -Force
Copy-Item (alias cp, copy, cpi)
Copy-Item C:\Source\Fichier.txt C:\Destination\
Copy-Item C:\Source\Dossier C:\Destination -Recurse
Move-Item (alias mv, move, mi)
Move-Item C:\Source\Fichier.txt C:\NouveauNom.txt
Move-Item C:\Source\Fichier.txt C:\Destination\
Rename-Item (alias ren, rni)
Rename-Item -Path C:\Temp\AncienNom.txt -NewName NouveauNom.txt
Get-Content (alias cat, type, gc)
Get-Content C:\Windows\System32\drivers\etc\hosts
Get-Content C:\Logs\app.log -Tail 10
Get-Content C:\Logs\app.log -Wait
Set-Content (alias sc)
Set-Content -Path C:\Temp\MonFichier.txt -Value "Nouvelle ligne de texte"
"Ligne 1", "Ligne 2" | Set-Content C:\Temp\MonFichier.txt
Add-Content (alias ac)
Add-Content -Path C:\Temp\MonFichier.txt -Value "Ligne ajoutée"
Test-Path
Test-Path C:\Windows
if (Test-Path C:\Temp\MonFichier.txt) { Write-Host "Le fichier existe" }
5. Gestion des Processus et Services
Get-Process (alias ps, gps)
Get-Process
Get-Process -Name "powershell*"
Get-Process | Where-Object {$_.CPU -gt 100}
Stop-Process -Name | -Id (alias kill, spps)
Stop-Process -Name "notepad"
Get-Process -Name "notepad" | Stop-Process -Force
Start-Process (alias start, saps)
Start-Process notepad.exe
Start-Process "C:\Program Files\Google\Chrome\Application\chrome.exe" "https://www.google.com"
Get-Service (alias gsv)
Get-Service
Get-Service -Name "Spooler"
Get-Service | Where-Object {$_.Status -eq "Running"}
Start-Service (alias sasv)
Start-Service -Name "Spooler"
Stop-Service (alias spsv)
Stop-Service -Name "Spooler"
Restart-Service (alias rsv)
Restart-Service -Name "Spooler"
Set-Service -StartupType
Set-Service -Name "BITS" -StartupType Automatic # Types: Automatic, Manual, Disabled
6. Variables et Types de Données
Les variables commencent par $.
$texte = "Bonjour PowerShell"
$nombre = 123
$tableau = 1, 2, "trois", $false
$hashtable = @{ Nom = "Utilisateur"; Age = 30; Ville = "Paris" }
$texte # Affiche la variable
Write-Host $nombre
$date = Get-Date # type [datetime]
$nombreString = "42"
$vraiNombre = [int]$nombreString # Conversion
Get-Variable (alias gv) et Remove-Variable (alias rv)
Get-Variable -Name "texte"
Remove-Variable -Name "texte"
7. Le Pipeline et la Manipulation d'Objets
Le pipeline (|) est au cœur de PowerShell.
ForEach-Object (alias foreach, %)
Get-Process | ForEach-Object { Write-Host "Processus : $($_.Name) - ID : $($_.Id)" }
1..5 | ForEach-Object { "Nombre : $_" }
Sort-Object (alias sort)
Get-Process | Sort-Object -Property CPU -Descending
Group-Object (alias group)
Get-Process | Group-Object -Property Company
Measure-Object (alias measure)
Get-ChildItem -File | Measure-Object -Property Length -Sum -Average -Maximum
Out-File et Out-GridView (alias ogv)
Get-Process | Out-File -FilePath C:\Temp\processus.txt
Get-Process | Out-GridView
Formatage de la sortie: Format-Table (ft), Format-List (fl), Format-Wide (fw)
Get-Process | Format-Table Name, ID, CPU -AutoSize
Get-Service -Name Spooler | Format-List *
Get-Command | Format-Wide Name -Column 4
8. Filtrage et Sélection
Where-Object (alias where, ?)
Get-Service | Where-Object {$_.Status -eq "Running"}
# Syntaxe PS 7+ simplifiée
Get-Service | Where-Object Status -eq "Running"
Get-ChildItem | Where-Object Length -gt 1MB
Select-Object (alias select)
Get-Process | Select-Object -Property Name, Id, CPU
Get-Process | Select-Object -First 5
Get-ChildItem | Select-Object Name, Length, @{Name="KiloBytes"; Expression={$_.Length / 1KB}}
9. Opérations sur les Chaînes de Caractères
$prenom = "Jean"
$nom = "Dupont"
$nomComplet = $prenom + " " + $nom # Concaténation
Write-Host "Bonjour, $nomComplet !" # Expansion
$texte = "PowerShell est puissant"
$texte.ToUpper()
$texte.Replace("puissant", "incroyable")
$texte.Split(" ")
"un,deux,trois" -split ","
("un", "deux", "trois") -join ";"
"abc123xyz" -match "\d+" # Regex, $Matches[0]
"Le prix est de 25 euros" -replace "\d+", "XX"
10. Travail avec les Données (CSV, JSON, XML)
CSV
$utilisateurs = Import-Csv -Path C:\Data\utilisateurs.csv
Get-Process | Select-Object Name,Id,CPU | Export-Csv -Path C:\Temp\process_list.csv -NoTypeInformation
JSON
$jsonString = '{"nom": "Alice", "age": 30}'
$objet = $jsonString | ConvertFrom-Json
$data = @{ Utilisateur = "Bob"; ID = 123 }
$data | ConvertTo-Json
XML
$xmlString = "PowerShell " # Notez < et >
$xmlDoc = [xml]$xmlString
Write-Host $xmlDoc.livres.livre.titre
# Pour exporter/importer des objets PowerShell au format XML spécifique
Get-Process -Name powershell | Export-Clixml -Path C:\Temp\process.xml
$processInfo = Import-Clixml C:\Temp\process.xml
11. Gestion des Modules
Get-Module
Get-Module # Modules importés
Get-Module -ListAvailable # Tous les modules installés
Import-Module
Import-Module Pester
Find-Module , Install-Module , Update-Module , Uninstall-Module
Find-Module Az
Install-Module Pester -Scope CurrentUser
Update-Module Pester
Uninstall-Module Pester
Get-Command -Module
Get-Command -Module Microsoft.PowerShell.Management
12. Réseau
Test-Connection (alias ping, tconn)
Test-Connection google.com -Count 2
Resolve-DnsName
Resolve-DnsName google.com -Type MX
Invoke-WebRequest (alias iwr, wget, curl)
$response = Invoke-WebRequest -Uri https://api.github.com/users/powershell
($response.Content | ConvertFrom-Json).public_repos
Invoke-RestMethod (alias irm)
$user = Invoke-RestMethod -Uri https://api.ipify.org?format=json
Write-Host "Mon IP publique est : $($user.ip)"
Test-NetConnection -Port (alias tnc)
Test-NetConnection google.com -Port 443
13. Fonctions et Scripts
Définir une fonction
function Get-Salutation {
param (
[string]$Nom = "Monde"
)
"Bonjour, $Nom !"
}
Get-Salutation -Nom "Alice"
Scripts (.ps1)
Exécuter avec .\MonScript.ps1. Gestion de la politique d'exécution :
Get-ExecutionPolicy
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Paramètres avancés
function Get-AdvancedData {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true, Position=0)]
[string]$ComputerName,
[Parameter(HelpMessage="Chemin du log.")]
[string]$LogPath = "C:\Logs\default.log",
[switch]$Force
)
Write-Verbose "Connexion à $ComputerName..."
# ...
}
14. Contrôle de Flux (Conditions, Boucles)
if / elseif / else
$age = 25
if ($age -lt 18) {
"Mineur"
} elseif ($age -ge 18 -and $age -lt 65) {
"Adulte"
} else {
"Senior"
}
# Opérateurs: -eq, -ne, -gt, -ge, -lt, -le, -like, -match, -contains
# Logiques: -and, -or, -xor, -not (!)
switch
$jour = (Get-Date).DayOfWeek
switch ($jour) {
"Monday" { "Début de semaine" }
"Friday" { "Presque le week-end !" }
default { "Un autre jour..." }
}
for, foreach, while, do/while, do/until
for ($i = 0; $i -lt 3; $i++) { "Itération : $i" }
$nombres = 1, 2, 3
foreach ($num in $nombres) { "Nombre : $num" }
$compteur = 0
while ($compteur -lt 2) { "Compteur : $compteur"; $compteur++ }
15. Fonctionnalités Spécifiques à PowerShell 7+
ForEach-Object -Parallel (PS 7.0+)
$servers = "google.com", "cloudflare.com", "unserveurpasnet.xyz"
$servers | ForEach-Object -Parallel {
if (Test-Connection -ComputerName $_ -Count 1 -Quiet) {
"$_ est accessible."
} else {
"$_ n'est PAS accessible."
}
} -ThrottleLimit 3
Opérateur Ternaire (PS 7.0+)
$age = 20
$status = ($age -ge 18) ? "Majeur" : "Mineur"
Write-Host $status
Opérateurs de coalescence nulle (PS 7.0+) : ?? et ??=
$configValue = $null
$effectiveValue = $configValue ?? "Default" # "Default"
$variable ??= "Assigné si nul"
Opérateurs de chaîne de pipeline (&& et ||) (PS 7.0+)
Test-Path C:\Fichier.txt && Get-Content C:\Fichier.txt
Remove-Item C:\NonExistant.txt -ErrorAction SilentlyContinue || Write-Warning "Échec suppression"
Vues d'erreur concises et Get-Error (PS 7.0+)
ErrorView est ConciseView par défaut. Get-Error pour plus de détails sur la dernière erreur.
16. Conseils pour Apprendre et Progresser
- Utilisez
Get-Helpconstamment. - Pratiquez dans la console.
- Décomposez les problèmes.
- Lisez les scripts des autres (ex: GitHub).
- Comprenez les objets avec
Get-Member. - Commencez par automatiser des tâches simples.
- Rejoignez des communautés (r/PowerShell, forums).
- Explorez les modules de la PowerShell Gallery.
- Apprenez les bases du scripting.
- Soyez patient et persévérant !