Guide PowerShell 7+

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).


Table des Matières

  1. Introduction à PowerShell
  2. Pour Commencer
  3. Concepts Fondamentaux
  4. Travailler avec les Objets
  5. Bases du Scripting
  6. Scripting Avancé
  7. Exécution à Distance et Automatisation
  8. Modules et Paquets
  9. Exercices Pratiques
  10. Solutions

1. Introduction à PowerShell

Qu'est-ce que PowerShell ?

Pourquoi utiliser PowerShell 7+ ?


2. Pour Commencer

Installation :

Lancer PowerShell :

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

3. Concepts Fondamentaux

Cmdlets

Exercice :
Lister tous les processus en cours d'exécution.

Get-Process

Le Pipeline |

Variables

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."

4. Travailler avec les Objets

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}}

5. Bases du Scripting

Écrire des Scripts

Paramètres et Entrées

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

6. Scripting Avancé

Fonctions

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

Gestion des Erreurs

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."
}

7. Exécution à Distance et Automatisation

PowerShell Remoting (PSRP) permet d'exécuter des commandes sur des machines distantes.

Pour l'automatisation, les Tâches planifiées PowerShell ou l'intégration avec des outils comme Azure Automation, Jenkins, etc., sont courantes.


8. Modules et Paquets

Les modules sont des ensembles de cmdlets, fonctions, variables, etc., qui étendent les fonctionnalités de PowerShell.


9. Exercices Pratiques

Exercice 1 : Lister tous les services arrêtés ('Stopped') sur votre machine.

Exercice 2 : Écrire un script qui accepte un nom de fichier en paramètre (obligatoire) et affiche ses 5 dernières lignes. Le script doit vérifier si le fichier existe.

Exercice 3 : Trouver tous les fichiers *.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.

Exercice 4 : Écrire une fonction 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.


10. Solutions

1. Lister tous les services qui sont arrêtés :

Get-Service | Where-Object { $_.Status -eq 'Stopped' }

2. Script pour afficher les 5 dernières lignes d'un fichier :

# 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."
}

3. Lister tous les fichiers .log et leurs détails dans un répertoire :

# 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"

4. Fonction de salutation basée sur l'heure :

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 -Online (par ex. Get-Help Get-ChildItem -Online) pour ouvrir la page de documentation la plus récente.