Introduction
Les astuces PowerShell sont des techniques avancées qui permettent aux administrateurs système et aux développeurs d’améliorer significativement leur efficacité et leur productivité. Cet article explore une série d’astuces PowerShell peu connues mais extrêmement utiles, allant de la création de snippets à la gestion des erreurs, en passant par l’utilisation avancée des fonctions. Ces astuces vous aideront à écrire du code plus propre, plus lisible et plus performant, tout en réduisant le temps passé sur des tâches répétitives.
Création de snippets personnalisés
L’une des astuces PowerShell les plus pratiques consiste à créer des snippets personnalisés pour les portions de code fréquemment utilisées. Voici comment procéder :
$raccourci2 = @'
tout
ton
script
que
tu
veux
pas
réécrire
déclarer
en
variable
en double cote ""
'@
New-IseSnippet -Title _script2 -Description "ceci est mon raccourci2" -Text $raccourci2
Cette astuce vous permet de sauvegarder des blocs de code entiers sous forme de snippets réutilisables, ce qui accélère considérablement le processus d’écriture de scripts.
Utilisation avancée des opérateurs
L’opérateur de plage
L’opérateur de plage (..) est une astuce PowerShell puissante pour générer des séquences de nombres ou manipuler des tableaux :
1..10
60..9
$s = Get-Service
$s[5..2]
Cet opérateur peut être utilisé de manière ascendante ou descendante, offrant une grande flexibilité dans la manipulation de données.
Simplification des structures conditionnelles
PowerShell permet de simplifier les structures conditionnelles, une astuce particulièrement utile pour rendre le code plus concis :
$status = ''
$out = if ($status) {0} else {1}
Cette syntaxe remplace avantageusement la structure if-else traditionnelle plus verbeuse.
Optimisation des instructions switch
L’utilisation du switch peut être optimisée pour une assignation directe :
$status = 3
$out = switch ($status) {
0 { 'ok' }
1 { 'Nok' }
2 { 'over' }
3 { 'overload' }
4 { 'overwhelming' }
default { 'no_idea'}
}
Cette astuce PowerShell permet d’éviter les répétitions et rend le code plus lisible.
Paramètres dynamiques dans les scripts
L’utilisation de paramètres dans les scripts est une astuce essentielle pour créer des scripts flexibles et réutilisables :
Function Ton_nom_et_age {
Param(
[string]$name= 'tutu',
[int]$age = 50
)
Write "$name à $age "
}

Cette approche permet de modifier les variables du script lors de son exécution, par exemple : Ton_nom_et_age -name toto -age 12
Création de cmdlets personnalisées
La création de cmdlets personnalisées est une astuce PowerShell avancée qui permet d’étendre les fonctionnalités de PowerShell :
Function tata {
[cmdletBinding()]
Param(
[parameter(mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
HelpMessage="Mon message d'aide ne t'aide pas 😀 ")]
[Alias('existence','generation')]
[allowEmptyString()]
[allowEmptyCollection()]
[string[]]$toto,
[validateset('12','80')]
[allowNull()]
[int]$age = 50,
[validateRange(0,5)]
[int]$bebe
)
Write 'ton age est :' + $age + ' et ton nom est' + $toto
}
Cette fonction illustre l’utilisation de plusieurs attributs avancés pour créer une cmdlet robuste et flexible.
Gestion des fonctions
Lister et supprimer des fonctions
Pour gérer efficacement vos fonctions, vous pouvez utiliser ces astuces PowerShell :
Get-PSDrive
dir function # affiche toutes les fonctions
Remove-Item function:\Ma_fonction # supprime la fonction
Utilisation des blocs Begin, Process et End
La structure Begin-Process-End est une astuce puissante pour optimiser le traitement des pipelines :
function fufu {
begin { tata }
process { titi }
end { toto }
}
1..5 | fufu
Cette structure permet d’exécuter du code avant, pendant et après le traitement des éléments du pipeline.
Astuces pratiques
Copier la sortie dans le presse-papiers
Une astuce PowerShell simple mais efficace pour copier rapidement la sortie d’une commande :
$tata = 'toto'
$tata | clip
Création d’une aide personnalisée
L’ajout d’une aide personnalisée est une astuce essentielle pour documenter vos fonctions :
<#
.Synopsis
Nous avons la section première qui ne contient aucun élément pertinent
.Parameter
Vous devriez ajouter les paramètres généraux…
.Parameter -tata
Vous devriez ajouter les paramètres pour tata…
.Example
Un exemple serait de ne rien faire
.Example
Vous pouvez mettre toutes les valeurs par défaut d'un man PowerShell comme Name, Description…
#>
function fufu {
begin { $tata }
process {
# On ajoute ceci également à la doc
$titi
}
end { $toto }
}
Gestion avancée des erreurs
La gestion des erreurs est une compétence cruciale, et PowerShell offre plusieurs astuces pour la faciliter :
$ErrorActionPreference = 'SilentlyContinue'
$ErrorView = 'CategoryView'
1..9 | Get-Acl -Path C:\toto$_ -EA SilentlyContinue -EV MonErreur
$MonErreur[4] | Get-Member
Ces techniques permettent de contrôler précisément le comportement de PowerShell face aux erreurs et d’obtenir des informations détaillées sur celles-ci.
PowerShell ne possède pas d’opérateur ternaire natif comme d’autres langages de programmation, mais il est possible de simuler un comportement similaire en utilisant une structure conditionnelle concise. Voici comment on peut créer une « commande ternaire » en PowerShell :
$resultat = if ($condition) { $valeurSiVrai } else { $valeurSiFaux }

Opérateur Ternaire
Qu’est-ce que l’opérateur ternaire ?
En PowerShell (version 7 et supérieures), l’opérateur ternaire est un moyen concis d’écrire une instruction conditionnelle simple, similaire à un if-else
classique mais sur une seule ligne. Sa syntaxe générale est la suivante :
<condition> ? <expression_si_vraie> : <expression_si_fausse>
Cette structure permet d’assigner une valeur à une variable en fonction d’une condition, de manière similaire à un opérateur ternaire.
Imaginons que vous vouliez afficher un message différent en fonction de la valeur d’une variable :
$isSunny = $true
$message = $isSunny ? "Il fait beau" : "Il fait gris"
Write-Host $message
Dans cet exemple :
- Si
$isSunny
est$true
, la valeur de$message
sera « Il fait beau ». - Si
$isSunny
est$false
, la valeur de$message
sera « Il fait gris ».
$number = 5
$result = $number % 2 -eq 0 ? "Pair" : "Impair"
Write-Host "$number est $result"
Cet exemple vérifie si un nombre est pair ou impair et affiche le résultat.
Pourquoi utiliser l’opérateur ternaire ?
- Concision : Il permet d’écrire du code plus compact, surtout pour des conditions simples.
- Lisibilité : Bien utilisé, il peut rendre le code plus lisible en regroupant une condition et ses conséquences sur une seule ligne.
Exemple d’utilisation :
function Verifier-Disponibilite($titre, $enStock) {
$statut = $enStock ? "disponible" : "indisponible"
Write-Host "Le livre '$titre' est $statut."
}
Verifier-Disponibilite "1984" $true
Verifier-Disponibilite "Brave New World" $false
Dans cet exemple, la fonction Verifier-Disponibilite
utilise une structure similaire à un opérateur ternaire pour déterminer si un livre est disponible ou non.
Cette approche offre une syntaxe concise pour les conditions simples, mais il est important de noter qu’elle n’est pas aussi compacte que les véritables opérateurs ternaires dans d’autres langages. Pour des conditions plus complexes, il est généralement préférable d’utiliser des structures if-else traditionnelles pour une meilleure lisibilité du code.
Framework .NET et .NET Core,
PowerShell s’appuie sur le framework .NET et .NET Core, ce qui lui permet d’accéder à une vaste bibliothèque de classes et de méthodes natives. Cela offre aux utilisateurs de PowerShell une grande puissance et flexibilité pour manipuler des objets complexes et effectuer des opérations avancées.
Par exemple, on peut utiliser la classe System.IO.FileInfo pour obtenir des informations détaillées sur un fichier :
$file = New-Object System.IO.FileInfo("C:\example.txt")
$file.LastWriteTime
$file.Length
Ces frameworks permettent également d’utiliser des méthodes .NET comme String.Format() ou DateTime.Parse() directement dans PowerShell :
[String]::Format("Le fichier {0} a été modifié le {1:d}", $file.Name, $file.LastWriteTime)
[DateTime]::Parse("2023-11-22").AddDays(7)
Pour explorer toutes les classes et méthodes disponibles, consultez la documentation Microsoft sur le .NET Class Library : https://docs.microsoft.com/fr-fr/dotnet/api/
L’intégration de .NET dans PowerShell permet de créer des scripts puissants combinant l’automatisation système avec des fonctionnalités avancées de programmation orientée objet.
Les Alias Foreach-Object / Where-Object
La syntaxe $variable | ? { ... }
et $variable | % { ... }
utilise des alias pour les cmdlets Where-Object et ForEach-Object respectivement. Voici des explications et des exemples :
Where-Object (alias ?)
Cette cmdlet filtre les objets dans un pipeline selon des critères spécifiques.
Exemple :
$processus = Get-Process
$processus | ? { $_.CPU -gt 10 }
Ce code filtre les processus dont l’utilisation CPU est supérieure à 10.
ForEach-Object (alias %)
Cette cmdlet exécute une opération sur chaque élément d’une collection.
Exemple :
$nombres = 1..5
$nombres | % { $_ * 2 }
Ce code multiplie chaque nombre par 2.
Pour voir les alias, on peut utiliser la commande Get-Alias :
Get-Alias ?
Get-Alias %
Ces commandes afficheront les alias pour Where-Object et ForEach-Object respectivement.
Ces alias permettent d’écrire du code plus concis, mais il est généralement recommandé d’utiliser les noms complets des cmdlets pour une meilleure lisibilité, surtout dans les scripts destinés à être partagés ou maintenus à long terme.
Conclusion
Les astuces PowerShell présentées dans cet article ne sont qu’un aperçu des nombreuses techniques avancées que PowerShell offre. En les maîtrisant, vous pourrez considérablement améliorer votre efficacité en tant qu’administrateur système ou développeur. N’hésitez pas à expérimenter avec ces astuces et à les adapter à vos besoins spécifiques. La pratique régulière et l’exploration continue de nouvelles fonctionnalités vous permettront de tirer le meilleur parti de cet outil puissant qu’est PowerShell.
Liens internes :
Liens externes :