Guide PowerShell 7+

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: ls pour Get-ChildItem, cd pour Set-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-Help constamment.
  • 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 !