Pwsh sur macOS contre Windows PowerShell 5.1
| Point | 5.1 | 7.x |
|---|---|---|
| exécutable | powershell.exe | pwsh |
| systèmes | Windows | Windows, macOS, Linux |
| base | .NET Framework | .NET moderne |
| politique d'exécution | appliquée | non appliquée hors Windows (Unrestricted, non modifiable) |
| modules Windows (registre, services, WMI…) | oui | absents ou limités : tester |
$PSVersionTable.PSVersionGet-ExecutionPolicy -ListBloc actif : la touche C copie la commande seule, sans invite ni sortie.
- Contexte : session
pwsh. - Droits : utilisateur courant.
- Effet : lecture de la version et de la politique.
- Vérification : la version s'affiche ; la liste des politiques par portée s'affiche.
- Retour arrière : sans objet.
Découvrir
| Besoin | Commande |
|---|---|
| trouver une commande | Get-Command -Verb Get -Noun *Process* |
| aide avec exemples | Get-Help <cmdlet> -Examples (-Full, -Online) |
| concepts | Get-Help about_Pipelines |
| propriétés et méthodes d'un objet | <commande> | Get-Member |
| verbes autorisés | Get-Verb |
Conventions
- Nom :
Verbe-Nomau singulier (Get-Process,Set-Location). Insensible à la casse. - Verbes sans effet :
Get,Select,Where,Sort,Measure,Test,Format. - Verbes à effet :
Set,New,Add,Rename,Move,Copy,Remove,Stop,Clear,Restart,Invoke. - Alias (
ls,gci,%,?) pour l'interactif ; noms complets dans un script.
Pipeline d'objets
| Cmdlet | Rôle | Exemple |
|---|---|---|
Where-Object | filtrer | Where-Object { $_.Length -gt 1KB } |
Select-Object | choisir | Select-Object Name, Id -First 5 |
Sort-Object | trier | Sort-Object CPU -Descending |
ForEach-Object | transformer | ForEach-Object { $_.Name } |
Measure-Object | compter / sommer | Measure-Object -Property Length -Sum |
Group-Object | regrouper | Group-Object Extension |
Format-Table / Format-List | afficher | en dernier |
$_ ou $PSItem : objet courant. Comparaisons : -eq -ne -gt -lt -ge -le -like -match -in -contains -and -or -not (jamais == ni > : > écrit un fichier).
Attention : pas de Format-* avant Export-Csv ou ConvertTo-Json.
Variables et structures
| Besoin | Syntaxe |
|---|---|
| variable | $nom = "demo" |
| type forcé | [int]$n = 3 |
| tableau | $t = @("a","b") ; $t.Count ; $t[0] |
| table de hachage | $h = @{ Cle = "v" } ; $h.Cle |
| ordre conservé | [ordered]@{ ... } |
| objet à propriétés | [pscustomobject]@{ Nom = "a"; Taille = 1 } |
| texte littéral / expansion | '...' / "... $var ..." |
| forcer un tableau | @(Get-ChildItem) |
| passer des paramètres | splatting : $p = @{ Path = "." } puis Get-ChildItem @p |
Fonctions et paramètres
function Get-Exemple { [CmdletBinding()] param( [Parameter(Mandatory)][ValidateNotNullOrEmpty()][string]$Nom, [ValidateRange(1, 100)][int]$Max = 10, [ValidateSet("a","b")][string]$Mode = "a" ) "$Nom $Max $Mode"}Bloc actif : la touche C copie la commande seule, sans invite ni sortie.
- Contexte : session
pwsh. - Droits : utilisateur courant.
- Effet : déclare la fonction en mémoire, rien d'autre.
- Vérification :
Get-Command Get-Exemplela trouve ;Get-Exemple -Nom xaffiche « x 10 a ». - Retour arrière : fermer la session.
Validation : Mandatory, ValidateNotNullOrEmpty, ValidateRange, ValidateSet, ValidateScript, ValidatePattern (liste à confirmer sur la page des paramètres avancés, non relue). Retourner des objets ; Write-Host = affichage seulement.
Erreurs
| Besoin | Syntaxe |
|---|---|
| rendre une erreur attrapable | -ErrorAction Stop |
| attraper | try { ... } catch { $_.Exception.Message } finally { ... } |
| type précis | catch [System.IO.IOException] { ... } |
| arrêter volontairement | throw "message" |
| défaut de session | $ErrorActionPreference = 'Stop' |
| dernière erreur | $Error[0] |
finally s'exécute toujours (y compris Ctrl+C, d'après la page 7.6). Ne pas masquer avec catch { } vide ou SilentlyContinue partout (peut même étouffer un throw).
Fichiers, CSV, JSON
| Besoin | Commande | Effet |
|---|---|---|
| lister | Get-ChildItem -File -Recurse | lecture |
| tester | Test-Path -LiteralPath <p> | lecture |
| lire | Get-Content -Raw -LiteralPath <p> | lecture |
| écrire | Set-Content, Out-File, Add-Content | écrit / écrase |
| CSV | Import-Csv / Export-Csv | lit / écrit |
| JSON | ConvertFrom-Json / ConvertTo-Json -Depth 5 | mémoire |
| supprimer | Remove-Item -LiteralPath <p> -WhatIf | irréversible |
Valeurs lues d'un CSV : chaînes ([int]$_.Taille). -LiteralPath = pas de jokers. Préciser -Encoding utf8 pour partager avec 5.1 (à vérifier).
-WhatIf, -Confirm, ShouldProcess
| Besoin | Syntaxe |
|---|---|
| essai à blanc | <cmdlet> ... -WhatIf |
| demander avant | <cmdlet> ... -Confirm |
| supprimer la demande | -Confirm:$false |
| dans ma fonction | [CmdletBinding(SupportsShouldProcess, ConfirmImpact='High')] |
| garde autour du changement | if ($PSCmdlet.ShouldProcess($cible, 'Opération')) { ... } |
| défauts | $ConfirmPreference = High ; ConfirmImpact = Medium |
Attention : -WhatIf n'est fiable que si la cmdlet implémente ShouldProcess ; l'héritage entre modules de script n'est pas garanti (page ShouldProcess).
Attention, effet notable. Cette commande a un effet notable. Lire le contexte, les droits et l’effet attendu indiqués après le bloc ; ne jamais l’exécuter sur un système réel sans validation, d’abord dans un environnement de test.
Remove-Item -LiteralPath ./essai.csv -WhatIfBloc actif : la touche C copie la commande seule, sans invite ni sortie.
- Contexte : dossier de test, fichier synthétique.
- Droits : aucun accès en écriture requis avec
-WhatIf. - Effet : décrit la suppression sans l'effectuer ; sans
-WhatIf, la suppression est définitive. - Vérification :
Test-Path ./essai.csvrenvoieTrue. - Retour arrière : pas de corbeille.
Politique d'exécution
- Fonction de sécurité de type « défense en profondeur », pas une frontière de sécurité (contournable en saisissant le contenu en ligne de commande).
- Appliquée seulement sous Windows ; sur macOS :
Unrestricted, non modifiable, comportementBypass. - Valeurs Windows :
Restricted,AllSigned,RemoteSigned(défaut),Unrestricted,Bypass,Undefined. Portées :Process,CurrentUser,LocalMachine, stratégie de groupe. - Ne pas copier un conseil «
Set-ExecutionPolicy Bypass».
Modules et PSGallery
| Besoin | Commande | Remarque |
|---|---|---|
| modules présents | Get-Module -ListAvailable | lecture |
| chercher | Find-Module <nom> (PowerShellGet) | réseau |
| installer | Install-Module / Install-PSResource | exécute du code d'un tiers : lire d'abord |
| version précise | -RequiredVersion | épingler |
| portée | -Scope CurrentUser | pas de droits élevés |
Risques : usurpation de nom, compte d'auteur compromis, mise à jour malveillante, dépendances. Contrôler auteur, dépôt source, date, téléchargements. Un module s'exécute avec vos droits. Précautions : bonnes pratiques générales, non issues d'une page officielle lue.
Scripts sûrs
| Faire | Éviter |
|---|---|
lecture seule d'abord, puis -WhatIf | écrire directement |
param() typé et validé | valeurs en dur |
-LiteralPath | -Path avec une entrée utilisateur |
'...' pour un texte non fiable | "..." avec une donnée externe |
pwsh -File ./script.ps1 après lecture | iwr ... | iex |
| JSON / CSV = données | Invoke-Expression sur une donnée externe |
| journaux sans secret | Write-Host d'un jeton |
Attention, effet notable. Cette commande a un effet notable. Lire le contexte, les droits et l’effet attendu indiqués après le bloc ; ne jamais l’exécuter sur un système réel sans validation, d’abord dans un environnement de test.
Get-Content -Raw ./script-telecharge.ps1Bloc actif : la touche C copie la commande seule, sans invite ni sortie.
- Contexte : lire un script non fiable avant tout ; ne jamais enchaîner avec
Invoke-Expression. - Droits : lecture du fichier.
- Effet : lecture seule.
- Vérification : chercher appels réseau, suppressions, Base64.
- Retour arrière : sans objet.
Secrets
- Jamais en clair dans un script, un historique, un journal, une URL.
SecureString: protection limitée (sous Windows chiffrement en mémoire ; sur macOS à vérifier).Get-Credential: saisie interactive, objetPSCredential.- SecretManagement (1.1.2) et SecretStore (1.0.6) : couche d'abstraction et coffre local chiffré ; modules « feature complete », dépôt archivé, corrections de sécurité seulement (page du 2026-06-22). Évaluer toute extension de coffre tierce.
- Sur le Mac de Stéphane : Trousseau macOS via
bin/secret get NOM/bin/avec-secretsde l'Orchestrator. Set-Secret,Register-SecretVaultmodifient la configuration : seulement avec un secret factice, après avis decyberagentpour un usage réel.
Procédure : lecture seule d'abord
décrire (Get-Command, Get-Help, Get-Member) → lire (Get-*, Test-*) → filtrer à l'écran → -WhatIf → dossier de test → vérifier le résultat → données réelles avec sauvegarde.
Sources
Consultées le 17 octobre 2026 ; documentation affichant PowerShell 7.6 (LTS), versions GitHub : v7.6.7 stable.
- Différences 5.1 / 7.x (s’ouvre dans un nouvel onglet) — Installer PowerShell 7 sur macOS (s’ouvre dans un nouvel onglet) — Versions GitHub (s’ouvre dans un nouvel onglet)
- about_Try_Catch_Finally (s’ouvre dans un nouvel onglet) — ShouldProcess (s’ouvre dans un nouvel onglet) — about_Execution_Policies (s’ouvre dans un nouvel onglet)
- PowerShell Gallery (s’ouvre dans un nouvel onglet) — SecretManagement et SecretStore (s’ouvre dans un nouvel onglet)
Points non vérifiés : voir la section correspondante du cours (pages about_Pipelines, about_Arrays, about_CommonParameters non relues, SecureString sous macOS, PSResourceGet, encodage par défaut, disponibilité des cmdlets sous macOS).