🟦 PowerShell
Objets, tableaux, fichiers, dossiers, pipelines
Aide-mémoire
PowerShell — Aide-mémoire
Objets — Créer & Manipuler
# Créer un objet PSCustomObject (la méthode recommandée)
$personne = [PSCustomObject]@{
Nom = "Dupont"
Prénom = "Jean"
Age = 42
Actif = $true
}
Accéder aux propriétés
$personne.Nom
$personne.Age
Ajouter une propriété dynamiquement
$personne | Add-Member -MemberType NoteProperty -Name "Email" -Value "[email protected]"
Modifier une propriété
$personne.Age = 43
Créer plusieurs objets (pattern tableau d'objets)
$equipe = @(
[PSCustomObject]@{ Nom="Alice"; Role="Admin"; Score=95 },
[PSCustomObject]@{ Nom="Bob"; Role="Dev"; Score=82 },
[PSCustomObject]@{ Nom="Carol"; Role="Admin"; Score=91 }
)
Filtrer, trier, sélectionner
$admins = $equipe | Where-Object { $_.Role -eq "Admin" }
$trié = $equipe | Sort-Object Score -Descending
$colonnes= $equipe | Select-Object Nom, Score
$top2 = $equipe | Sort-Object Score -Descending | Select-Object -First 2
Afficher proprement
$equipe | Format-Table -AutoSize
$equipe | Format-List # Une propriété par ligne
$personne | ConvertTo-Json # Sérialiser en JSON
Tableaux (Arrays)
# Créer un tableau
$nombres = @(1, 2, 3, 4, 5)
$vide = @()
$mixte = @("texte", 42, $true, $null)
$plage = 1..10 # 1 à 10
$lettres = 'A'..'Z' # A à Z
Accéder aux éléments
$nombres[0] # Premier (index 0)
$nombres[-1] # Dernier
$nombres[1..3] # Slice : index 1 à 3
$nombres[-3..-1] # 3 derniers éléments
Ajouter / Supprimer (tableaux fixes → utiliser ArrayList pour performances)
$nombres += 6 # Ajoute (recrée le tableau ⚠️)
$nombres = $nombres | Where-Object { $_ -ne 3 } # Supprimer la valeur 3
ArrayList (mutable, performant)
$liste = [System.Collections.ArrayList]@(1, 2, 3)
$liste.Add(4) | Out-Null # Add retourne l'index, Out-Null le cache
$liste.Remove(2) # Supprimer par valeur
$liste.RemoveAt(0) # Supprimer par index
$liste.Count # Nombre d'éléments
$liste.Contains(3) # $true / $false
Opérations courantes
$nombres.Count # Longueur
$nombres -contains 3 # Test présence
$nombres | Measure-Object -Sum -Average -Max -Min # Statistiques
($nombres | Measure-Object -Sum).Sum # Somme directe
$nombres -join ", " # Joindre en chaîne : "1, 2, 3, 4, 5"
"a,b,c" -split "," # Diviser : @("a","b","c")
Hashtables (Dictionnaires)
# Créer une hashtable
$config = @{
Serveur = "192.168.1.10"
Port = 5432
DB = "production"
SSL = $true
}
Accéder / Modifier
$config["Serveur"] # Via index
$config.Serveur # Via propriété
$config["NouvelleClé"] = "valeur" # Ajouter
$config.Remove("SSL") # Supprimer
$config.ContainsKey("Port") # Test existence
$config.Keys # Toutes les clés
$config.Values # Toutes les valeurs
$config.Count # Nombre d'entrées
Itérer
foreach ($key in $config.Keys) {
Write-Host "$key = $($config[$key])"
}
$config.GetEnumerator() | Sort-Object Key | Format-Table # Trié + affiché
Hashtable ordonnée
$ordered = [ordered]@{
Premier = 1
Deuxième = 2
Troisième = 3
}
Imbriquer des hashtables
$infra = @{
Prod = @{ IP="10.0.1.1"; RAM=32 }
Dev = @{ IP="10.0.2.1"; RAM=8 }
}
$infra.Prod.IP # "10.0.1.1"
Fichiers & Dossiers
# Tester l'existence
Test-Path "C:\fichier.txt"
Test-Path "C:\dossier" -PathType Container # Dossier uniquement
Test-Path "C:\fichier.txt" -PathType Leaf # Fichier uniquement
Lire un fichier
Get-Content "fichier.txt" # Tableau de lignes
Get-Content "fichier.txt" -Raw # Chaîne brute
Get-Content "fichier.txt" -Tail 20 # 20 dernières lignes
Get-Content "fichier.txt" -Wait # tail -f
Écrire dans un fichier
"Ligne 1" | Out-File "sortie.txt" # Crée/écrase (UTF-16 par défaut)
"Ligne 1" | Out-File "sortie.txt" -Encoding utf8
"Ligne 1" | Out-File "sortie.txt" -Append # Ajouter
Set-Content "sortie.txt" "Contenu" # Crée/écrase proprement
Add-Content "sortie.txt" "Nouvelle ligne" # Ajouter
Copier / Déplacer / Supprimer
Copy-Item "source.txt" "dest.txt"
Copy-Item "dossier\" "backup\" -Recurse
Move-Item "ancien.txt" "nouveau.txt"
Remove-Item "fichier.txt"
Remove-Item "dossier\" -Recurse -Force # Supprimer récursivement
Rename-Item "ancien.txt" "nouveau.txt"
Créer
New-Item "fichier.txt" -ItemType File
New-Item "dossier\" -ItemType Directory
New-Item "fichier.txt" -ItemType File -Value "Contenu initial"
Lister
Get-ChildItem "C:\dossier" # ls / dir
Get-ChildItem "C:\dossier" -Recurse # Récursivement
Get-ChildItem "C:\dossier" -Filter "*.log" # Filtrer par extension
Get-ChildItem "C:\dossier" -Recurse -File # Fichiers uniquement
Get-ChildItem "C:\dossier" -Recurse -Directory # Dossiers uniquement
Métadonnées
$f = Get-Item "fichier.txt"
$f.Name # Nom
$f.FullName # Chemin complet
$f.Extension # .txt
$f.Length # Taille en octets
$f.LastWriteTime # Date modification
Trouver les gros fichiers
Get-ChildItem "C:\" -Recurse -File |
Sort-Object Length -Descending |
Select-Object -First 20 |
Format-Table Name, @{N="Mo";E={[math]::Round($_.Length/1MB,1)}}, FullName
Parcourir un objet / Tableau
# ForEach-Object (pipeline) — pour de grands volumes
1..1000 | ForEach-Object { $_ * 2 }
$services | ForEach-Object { Write-Host $_.Name }
foreach (boucle) — plus rapide sur petits tableaux
foreach ($item in $tableau) {
Write-Host $item
}
ForEach avec index
for ($i = 0; $i -lt $tableau.Count; $i++) {
Write-Host "[$i] $($tableau[$i])"
}
.ForEach() méthode (PS 4+, le plus rapide)
$tableau.ForEach({ Write-Host $_ })
$tableau.ForEach({ param($x) $x * 2 })
Parcourir un objet (ses propriétés)
$objet = [PSCustomObject]@{ A=1; B=2; C=3 }
$objet.PSObject.Properties | ForEach-Object {
Write-Host "$($_.Name) = $($_.Value)"
}
Ou via la hashtable si c'est une hashtable
$hash.GetEnumerator() | ForEach-Object {
Write-Host "$($_.Key) = $($_.Value)"
}
Parcourir récursivement (exemple : JSON imbriqué)
function Traverse($obj, $indent=0) {
$obj.PSObject.Properties | ForEach-Object {
$pad = " " * $indent
if ($_.Value -is [PSCustomObject]) {
Write-Host "${pad}$($_.Name):"
Traverse $_.Value ($indent + 1)
} else {
Write-Host "${pad}$($_.Name) = $($_.Value)"
}
}
}
Pipelines & Filtres
# Where-Object (filtrer)
$services | Where-Object { $_.Status -eq "Running" }
$services | Where-Object Status -eq "Running" # Syntaxe courte
$fichiers | Where-Object { $_.Length -gt 1MB }
$logs | Where-Object { $_ -match "ERROR" }
Select-Object (colonnes)
$objet | Select-Object Nom, Age # Garder certaines propriétés
$objet | Select-Object -ExcludeProperty MdP # Exclure
$objet | Select-Object * # Tout
$objet | Select-Object -ExpandProperty Adresses # Aplatir un sous-objet
$objet | Select-Object Nom, @{N="NomMaj";E={$_.Nom.ToUpper()}} # Propriété calculée
Group-Object (regrouper)
$logs | Group-Object Niveau | Format-Table Count, Name
$users | Group-Object Department | Where-Object Count -gt 5
Measure-Object (statistiques)
$fichiers | Measure-Object Length -Sum -Average -Max -Min
Get-Process | Measure-Object CPU -Sum
Sort-Object
$objet | Sort-Object Age
$objet | Sort-Object Age -Descending
$objet | Sort-Object Dept, Age # Tri multi-colonnes
$objet | Sort-Object { $_.Nom.Length } # Tri par expression
Tee-Object (bifurquer le pipeline)
Get-Process | Tee-Object -FilePath processes.txt | Where-Object CPU -gt 10
Fonctions
# Fonction simple
function Dire-Bonjour {
param([string]$Nom = "Monde")
Write-Host "Bonjour, $Nom !"
}
Dire-Bonjour
Dire-Bonjour -Nom "Alice"
Fonction avec validation et types
function Get-UserInfo {
[CmdletBinding()]
param(
[Parameter(Mandatory, Position=0)]
[string]$Serveur,
[Parameter(Mandatory)]
[ValidateRange(1,65535)]
[int]$Port = 443,
[switch]$VerboseOutput
)
if ($VerboseOutput) { Write-Verbose "Connexion à $Serveur:$Port" }
# Retourner un objet structuré
return [PSCustomObject]@{
Serveur = $Serveur
Port = $Port
Statut = "OK"
Timestamp = Get-Date
}
}
Fonctions avec pipeline
function Convertir-Taille {
process {
$_ / 1MB # $_ = objet courant dans le pipeline
}
}
Get-ChildItem -Recurse -File | Select-Object -ExpandProperty Length | Convertir-Taille
Gestionnaire d'erreurs dans une fonction
function Lire-Config {
param([string]$Chemin)
try {
$contenu = Get-Content $Chemin -Raw -ErrorAction Stop
return $contenu | ConvertFrom-Json
}
catch [System.IO.FileNotFoundException] {
Write-Warning "Fichier non trouvé : $Chemin"
return $null
}
catch {
Write-Error "Erreur inattendue : $_"
throw
}
finally {
Write-Verbose "Lecture terminée"
}
}
Gestion des erreurs
# $ErrorActionPreference
$ErrorActionPreference = "Stop" # Toute erreur devient terminale
$ErrorActionPreference = "SilentlyContinue"# Ignorer les erreurs
-ErrorAction par commande
Get-Item "inexistant" -ErrorAction SilentlyContinue
Get-Item "inexistant" -ErrorAction Stop
Try / Catch / Finally
try {
$r = Invoke-RestMethod "https://api.exemple.com/data" -ErrorAction Stop
}
catch [System.Net.WebException] {
Write-Warning "Erreur réseau : $($_.Exception.Message)"
}
catch {
Write-Error "Erreur : $_"
}
finally {
# Toujours exécuté
}
$? = succès de la dernière commande
Get-Item "fichier.txt"
if (-not $?) { Write-Error "Échec" }
JSON / CSV / XML
# JSON
$obj | ConvertTo-Json # Objet → JSON
$obj | ConvertTo-Json -Depth 10 # Profondeur (défaut: 2)
$json = Get-Content "data.json" -Raw | ConvertFrom-Json
$obj | ConvertTo-Json | Out-File "data.json" -Encoding utf8
CSV
$data | Export-Csv "rapport.csv" -NoTypeInformation -Encoding UTF8
$data = Import-Csv "rapport.csv"
$data | Export-Csv "rapport.csv" -Append -NoTypeInformation
XML
[xml]$xml = Get-Content "config.xml"
$xml.configuration.appSettings.add | Where-Object key -eq "port"
Variables d'environnement
$env:PATH
$env:COMPUTERNAME
[System.Environment]::GetEnvironmentVariable("PATH", "Machine") # Persistant
[System.Environment]::SetEnvironmentVariable("MYVAR", "val", "User") # Persistant
Commandes essentielles
# Aide
Get-Help Get-Process -Full
Get-Help Get-Process -Examples
Get-Command -Name "service" # Trouver une commande
Get-Member -InputObject $objet # Explorer les méthodes/propriétés
Modules
Get-Module -ListAvailable
Import-Module ActiveDirectory
Install-Module -Name PSWindowsUpdate -Scope CurrentUser
Mesurer le temps d'exécution
Measure-Command { Get-ChildItem C:\ -Recurse }
Variables spéciales
$true, $false, $null # Booléens et null
$_ # Objet courant dans pipeline
$PSVersionTable # Version PowerShell
$PSScriptRoot # Dossier du script en cours
$MyInvocation.MyCommand.Name # Nom du script/fonction
$args # Arguments non-nommés
🔧 Ouvrir tools.rdr-it.com — application complète →
Plus de 40 outils AdminSys gratuits · SSL · DNS · Docker · Nginx · SSH · Mermaid · et plus