PowerShell 7.1 peut sembler ne pas apporter de changements spectaculaires de prime abord, mais il y a en réalité beaucoup d’améliorations en profondeur. De plus, un certain nombre de fonctionnalités et d’outils très pratiques sont disponibles, permettant d’optimiser vos scripts et de développer des solutions encore plus performantes. Sorti le 11 novembre 2020, PowerShell 7.1 est rapidement adopté par de nombreux professionnels de l’informatique. Cet article met en évidence plusieurs de ces améliorations, sans prétendre à une liste exhaustive.
Évolutions architecturales
L’amélioration majeure réside dans le fait que PowerShell 7.1 est construit sur la base de .NET 5, une version importante qui poursuit l’unification de .NET traditionnel et .NET Core. Avec .NET 5, les premiers pas vers un noyau unifié sont franchis. PowerShell 7.1 bénéficie ainsi de gains de performance significatifs et d’améliorations au niveau du langage.
Mises à jour des modules de base et améliorations de chargement
PowerShell 7.1 inclut plusieurs mises à jour des modules centraux. En particulier, PSReadLine 2.1.0 intègre désormais IntelliSense prédictif, un moteur de prédiction syntaxique inspiré de Fish shell. De plus, de nombreuses corrections ont été apportées au mode vi et la possibilité de définir le MaximumHistoryCount
à partir du profil utilisateur est maintenant offerte.
Pour améliorer le chargement du module WinCompat
, les modules PowerShell 7 sont désormais traités avec une priorité plus élevée. Ceci évite l’écrasement accidentel des modules principaux lors de l’utilisation de WinCompat
pour permettre aux modules PowerShell 7 non natifs de fonctionner dans cette version mise à jour.
Nouvelles fonctionnalités du moteur
Bien sûr, plusieurs nouvelles fonctionnalités de base sont à noter. Les trois principales sont:
PSNullConditionalOperators
PSUnixStat
- Prise en charge de TLS 1.3
Les opérateurs conditionnels nuls ont été introduits dans PowerShell 7 comme fonctionnalité expérimentale. Ils sont maintenant standard et inclus par défaut dans PowerShell 7.1. Il existe deux nouveaux opérateurs, ??
et ??=
.
# Remplace généralement une instruction if null et exécute la sortie si la valeur est nulle.
$Object ?? '$object contient une valeur $null'
# Si la valeur de la condition est nulle, affecte l'objet à la valeur à droite de la condition.
$Object ??= 'Cette valeur est attribuée si $object est nul'
Ensuite, l’option PSUnixStat
, qui passe du statut expérimental au statut standard, même si elle peut apparaître comme expérimentale par moments. Cette fonctionnalité est exclusive aux systèmes Linux. Vous pouvez vérifier son statut et l’activer comme suit :
# S'assurer que cette fonctionnalité est activée, redémarrer la session PowerShell est nécessaire.
Get-ExperimentalFeature -Name 'PSUnixFileStat' | Enable-ExperimentalFeature
Cette fonctionnalité ajoute une nouvelle propriété UnixMode
qui affiche les informations de la commande Unix stat
. Ceci est très utile pour ceux qui travaillent fréquemment avec les permissions Linux.
Enfin, la prise en charge de TLS 1.3 est maintenant intégrée dans diverses cmdlets web comme Invoke-RestMethod
et Invoke-WebRequest
. Pour ceux qui souhaitent bénéficier des améliorations de performance et de sécurité de cette nouvelle version TLS et qui interagissent avec un point de terminaison compatible, c’est un ajout précieux. Si le site prend en charge TLS 1.3, le contenu sera renvoyé et la communication sera établie via le nouveau protocole.
Invoke-RestMethod -Uri '<https://mysite.com>' -SslProtocol Tls13
Améliorations additionnelles
Plusieurs autres fonctionnalités et améliorations contribuent à augmenter vos capacités et à affiner vos scripts.
- Dans l’environnement Windows,
Start-Process
inclura désormais, par défaut, toutes les variables d’environnement de la session en cours. Uniquement en utilisant le paramètreUseNewEnvironment
, un nouvel environnement sera créé avec de nouvelles variables de processus. - La commande
ForEach-Object -Parallel
réutilise maintenant les espaces d’exécution, améliorant ainsi la gestion de la mémoire et les performances. Pour ceux qui craignent que l’isolation maximale de l’espace d’exécution ne soit pas atteinte, le paramètreUseNewRunspace
permet de créer un nouvel espace d’exécution pour chaque itération du pipeline. - La commande
Get-Random
inclut désormais le paramètreShuffle
. Ceci prendra une collection passée via un pipeline àGet-Random
ou viaInputObject
et renverra la même collection, mais avec les éléments mélangés de manière aléatoire. - Le paramètre
AsUTC
est ajouté à la commandeGet-Date
, simplifiant ainsi les conversions traditionnelles nécessaires, notamment avec l’objet[DateTime]
. - La cmdlet
Stop-Computer
est implémentée pour les systèmes Linux et macOS, en s’appuyant sur le binaire/sbin/shutdown
. Sur Linux, l’argument passé estnow
et sur macOS, il est-P now
. - Similaire à
Stop-Computer
,Restart-Computer
est implémentée pour Linux et macOS, utilisant le binaire/sbin/shutdown
et passant l’argument-r now
.
Changements cassants
Enfin, il y a quelques changements cassants. Il y en a plus, mais ces deux-là peuvent affecter les scripts plus que d’autres.
- Le changement de nom de
FromUnixTime
àUnixTimeSeconds
sur la cmdletGet-Date
pour autoriser l’entrée de l’heure Unix peut impacter les scripts qui utilisent cette fonctionnalité et qui devront être mis à jour. - Ne pas envelopper le résultat de retour dans
PSObject
lors de la conversion de ScriptBlock en types délégués. Il s’agit d’une situation rare lors de la conversion d’un scriptblock où vous souhaitez que le type de retour soit l’objet d’origine et non converti en PSObject.
Conclusion
PowerShell 7.1 n’introduit peut-être pas d’énormes nouvelles fonctionnalités en apparence, mais il apporte de nombreuses améliorations progressives et des changements majeurs en profondeur. L’écosystème et le langage PowerShell continuent de s’améliorer à chaque itération et deviennent rapidement un outil essentiel et populaire pour les administrateurs systèmes du monde entier.