Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Windows PowerShell 5.1 repose sur .NET Framework v4.5. Avec la version de PowerShell 6.0, PowerShell est devenu un projet open source basé sur .NET Core 2.0. Le passage du .NET Framework à .NET Core a permis à PowerShell de devenir une solution multiplateforme. PowerShell s’exécute sur Windows, macOS et Linux.
Il existe quelques différences dans le langage PowerShell entre Windows PowerShell et PowerShell. Les différences les plus notables sont dans la disponibilité et le comportement des applets de commande PowerShell entre les plateformes Windows et non-Windows et les modifications qui découlent des différences entre .NET Framework et .NET Core.
Cet article résume les différences significatives et les changements cassants entre Windows PowerShell et la version actuelle de PowerShell. Ce résumé n’inclut pas de nouvelles fonctionnalités ou applets de commande qui ont été ajoutées. Cet article ne décrit pas non plus ce qui a changé entre les versions. L’objectif de cet article est de présenter l’état actuel de PowerShell et comment cela diffère de Windows PowerShell. Pour une présentation détaillée des modifications entre les versions et l’ajout de nouvelles fonctionnalités, consultez les articles What’s New pour chaque version.
- Nouveautés de PowerShell 7.5
- Nouveautés de PowerShell 7.4
- Nouveautés de PowerShell 7.3
- Nouveautés de PowerShell 7.2
- Nouveautés de PowerShell 7.1
- Nouveautés de PowerShell 7.0
- Nouveautés de PowerShell 6.x
.NET Framework et .NET Core
PowerShell sur Linux et macOS utilise .NET Core, qui est un sous-ensemble du .NET Framework complet sur Microsoft Windows. Cela est important, car PowerShell fournit un accès direct aux types et méthodes de framework sous-jacents. Par conséquent, les scripts qui s’exécutent sur Windows peuvent ne pas s’exécuter sur des plateformes non-Windows en raison des différences dans les frameworks. Pour plus d’informations sur les modifications de .NET Core, consultez Modifications importantes pour la migration de .NET Framework vers .NET Core.
Chaque nouvelle version de PowerShell repose sur une version plus récente de .NET. Il peut y avoir des modifications de rupture dans .NET qui affectent PowerShell.
- PowerShell 7.6 - Basé sur .NET 10.0 (LTS)
- PowerShell 7.5 - Basé sur .NET 9.0
- PowerShell 7.4 - Basé sur .NET 8.0 (LTS)
- PowerShell 7.3 - Basé sur .NET 7.0
- PowerShell 7.2 - Basé sur .NET 6.0 (LTS)
- PowerShell 7.1 - Basé sur .NET 5.0
- PowerShell 7.0 - Basé sur .NET Core 3.1 (LTS)
- PowerShell 6.2 - Basé sur .NET Core 2.1
- PowerShell 6.1 - Basé sur .NET Core 2.1
- PowerShell 6.0 - Basé sur .NET Core 2.0
Avec l’avènement de .NET Standard 2.0, PowerShell peut charger de nombreux modules Windows PowerShell traditionnels sans modification. En outre, PowerShell 7 inclut une fonctionnalité de compatibilité Windows PowerShell qui vous permet d’utiliser des modules Windows PowerShell qui nécessitent toujours l’infrastructure complète.
Pour plus d’informations, voir :
Tenez compte des modifications de méthode .NET
Bien que les modifications de méthode .NET ne soient pas spécifiques à PowerShell, elles peuvent affecter vos scripts, en particulier si vous appelez directement des méthodes .NET. En outre, il peut y avoir de nouvelles surcharges pour les constructeurs. Cela peut avoir un impact sur la façon dont vous créez des objets à l’aide New-Object ou la [type]::new() méthode.
Par exemple, .NET a ajouté des surcharges à la [System.String]::Split() méthode qui ne sont pas disponibles dans .NET Framework 4.5. La liste suivante présente les surcharges de la Split() méthode disponible dans Windows PowerShell 5.1 :
PS> "".Split
OverloadDefinitions
-------------------
string[] Split(Params char[] separator)
string[] Split(char[] separator, int count)
string[] Split(char[] separator, System.StringSplitOptions options)
string[] Split(char[] separator, int count, System.StringSplitOptions options)
string[] Split(string[] separator, System.StringSplitOptions options)
string[] Split(string[] separator, int count, System.StringSplitOptions options)
La liste suivante présente les surcharges de la Split() méthode disponible dans PowerShell 7 :
"".Split
OverloadDefinitions
-------------------
string[] Split(char separator, System.StringSplitOptions options)
string[] Split(char separator, int count, System.StringSplitOptions options)
string[] Split(Params char[] separator)
string[] Split(char[] separator, int count)
string[] Split(char[] separator, System.StringSplitOptions options)
string[] Split(char[] separator, int count, System.StringSplitOptions options)
string[] Split(string separator, System.StringSplitOptions options)
string[] Split(string separator, int count, System.StringSplitOptions options)
string[] Split(string[] separator, System.StringSplitOptions options)
string[] Split(string[] separator, int count, System.StringSplitOptions options)
Dans Windows PowerShell 5.1, vous pouviez passer un tableau de caractères (char[]) à la méthode Split() comme string. La méthode fractionne la chaîne cible à n’importe quelle occurrence d’un caractère dans le tableau. La commande suivante fractionne la chaîne cible dans Windows PowerShell 5.1, mais pas dans PowerShell 7 :
# PowerShell 7 example
"1111p2222q3333".Split('pq')
1111p2222q3333
Pour établir une liaison à la surcharge correcte, vous devez convertir la chaîne en tableau de caractères :
# PowerShell 7 example
"1111p2222q3333".Split([char[]]'pq')
1111
2222
3333
Les modules ne sont plus fournis avec PowerShell
Pour différentes raisons de compatibilité, les modules suivants ne sont plus inclus dans PowerShell.
- ISE
- Microsoft.PowerShell.LocalAccounts
- Microsoft.PowerShell.ODataUtils
- Microsoft.PowerShell.Operation.Validation
- PSScheduledJob
- PSWorkflow
- PSWorkflowUtility
Workflow de PowerShell
Le flux de travail PowerShell est une fonctionnalité de Windows PowerShell qui s’appuie sur Windows Workflow Foundation (WF) et permet la création de runbooks robustes pour des tâches longues ou parallélisées.
En raison du manque de prise en charge de Windows Workflow Foundation dans .NET Core, nous avons supprimé le flux de travail PowerShell de PowerShell.
À l’avenir, nous aimerions activer le parallélisme/concurrence natif dans le langage PowerShell sans avoir besoin de flux de travail PowerShell.
S’il est nécessaire d’utiliser des points de contrôle pour reprendre un script après le redémarrage du système d’exploitation, nous vous recommandons d’utiliser le planificateur de tâches pour exécuter un script au démarrage du système d’exploitation, mais le script doit conserver son propre état (comme le conserver dans un fichier).
Applets de commande supprimées de PowerShell
Pour les modules inclus dans PowerShell, les applets de commande suivantes ont été supprimées de PowerShell pour différentes raisons de compatibilité ou l’utilisation d’API non prises en charge.
CimCmdlets
Export-BinaryMiLog
Microsoft.PowerShell.Core
Add-PSSnapinExport-ConsoleGet-PSSnapinRemove-PSSnapinResume-JobSuspend-Job
Microsoft.PowerShell.Diagnostics
Export-CounterImport-Counter
Microsoft.PowerShell.Management
Add-ComputerCheckpoint-ComputerClear-EventLogComplete-TransactionDisable-ComputerRestoreEnable-ComputerRestoreGet-ComputerRestorePointGet-ControlPanelItemGet-EventLogGet-TransactionGet-WmiObjectInvoke-WmiMethodLimit-EventLogNew-EventLogNew-WebServiceProxyRegister-WmiEventRemove-ComputerRemove-EventLogRemove-WmiObjectReset-ComputerMachinePasswordRestore-ComputerSet-WmiInstanceShow-ControlPanelItemShow-EventLogStart-TransactionTest-ComputerSecureChannelUndo-TransactionUse-TransactionWrite-EventLog
Microsoft.PowerShell.Utility
Convert-StringConvertFrom-String
PSDesiredStateConfiguration
Disable-DscDebugEnable-DscDebugGet-DscConfigurationGet-DscConfigurationStatusGet-DscLocalConfigurationManagerPublish-DscConfigurationRemove-DscConfigurationDocumentRestore-DscConfigurationSet-DscLocalConfigurationManagerStart-DscConfigurationStop-DscConfigurationTest-DscConfigurationUpdate-DscConfiguration
Applets de commande WMI v1
Les applets de commande WMI v1 suivantes ont été supprimées de PowerShell :
Register-WmiEventSet-WmiInstanceInvoke-WmiMethodGet-WmiObjectRemove-WmiObject
Les applets de commande du module CimCmdlets (aka WMI v2) exécutent la même fonction et fournissent de nouvelles fonctionnalités et une syntaxe repensée.
New-WebServiceProxy CMDLET retiré
.NET Core ne prend pas en charge windows Communication Framework, qui fournit des services pour l’utilisation du protocole SOAP. Cette applet de commande a été supprimée, car elle nécessite SOAP.
*-Transaction Cmdlets supprimés
Ces applets de commande avaient une utilisation très limitée. La décision a été prise d’interrompre l’appui pour eux.
Complete-TransactionGet-TransactionStart-TransactionUndo-TransactionUse-Transaction
*-EventLog applets de commande
En raison de l’utilisation d’API non prises en charge, les *-EventLog applets de commande ont été supprimées de PowerShell.
Get-WinEvent et New-WinEvent sont disponibles pour obtenir et créer des événements sur Windows.
Applets de commande qui utilisent Windows Presentation Framework (WPF)
.NET Core 3.1 a ajouté la prise en charge de WPF. Par conséquent, la version de PowerShell 7.0 a restauré les fonctionnalités spécifiques à Windows suivantes :
- Le cmdlet
Show-Command - Le cmdlet
Out-GridView - Paramètre ShowWindow de
Get-Help
Modifications de la configuration de l’état souhaité (DSC) PowerShell
Invoke-DscResource a été restauré en tant que fonctionnalité expérimentale dans PowerShell 7.0.
À compter de PowerShell 7.2, le module PSDesiredStateConfiguration a été supprimé de PowerShell et a été publié dans PowerShell Gallery. Pour plus d’informations, consultez l’annonce dans le blog de l’équipe PowerShell.
Modifications de l’exécutable PowerShell
powershell.exe renommé en pwsh.exe
Le nom binaire de PowerShell a été remplacé powershell(.exe) par pwsh(.exe). Cette modification permet aux utilisateurs d’exécuter PowerShell sur des machines et de prendre en charge les installations côte à côte de Windows PowerShell et PowerShell.
Modifications supplémentaires de pwsh(.exe) :powershell.exe
- Changement du premier paramètre positionnel de
-Commandà-File. Ce changement corrige l’utilisation (#!c’est-à-dire en shebang) dans les scripts PowerShell exécutés depuis des shells non-PowerShell sur des plateformes non-Windows. Cela signifie aussi que vous pouvez exécuter des commandes commepwsh foo.ps1oupwsh fooScriptsans spécifier-File. Cependant, ce changement nécessite que vous spécifiiez-cexplicitement ou-Command, lors de l’exécution de commandes commepwsh.exe -Command Get-Command. -
pwshaccepte l'option-i(ou-Interactive) pour indiquer un interpréteur de commandes interactif. Cela permet à PowerShell d’être utilisé comme interpréteur de commandes par défaut sur des plateformes Unix. - Paramètres
-ImportSystemModulessupprimés et-PSConsoleFiledepwsh.exe. - Aide modifiée
pwsh -Versionet intégrée pourpwsh.exes’aligner avec d’autres outils natifs. - Messages d’erreur d’argument non valides pour
-Fileet-Commandcodes de sortie conformes aux normes Unix - Paramètre ajouté
-WindowStylesur Windows. De même, les mises à jour des installations basées sur des packages sur des plateformes autres que Windows sont mises à jour sur place.
Le nom raccourci est également cohérent avec le nommage des interpréteurs de commandes sur les plateformes non-Windows.
Prise en charge de l’exécution d’un script PowerShell avec paramètre bool
Auparavant, l'utilisation de pwsh.exe pour exécuter un script PowerShell ne fournissait aucune manière de passer $true/$false en tant que valeurs de paramètre. Le support des $true/$false valeurs analysées vers les paramètres a été ajouté. Les valeurs de commutateur sont également prises en charge.
Compatibilité ascendante améliorée avec Windows PowerShell
Pour Windows, un nouveau paramètre de commutation, UseWindowsPowerShell , est ajouté à Import-Module. Ce commutateur crée un module proxy dans PowerShell 7 qui utilise un processus PowerShell local Windows pour exécuter implicitement tous les cmdlets contenus dans ce module. Pour plus d’informations, consultez Import-Module .
Pour plus d’informations sur les modules Microsoft compatibles avec PowerShell 7.0, consultez le tableau de compatibilité des modules.
Prise en charge de Microsoft Update pour Windows
PowerShell 7.2 a ajouté la prise en charge de Microsoft Update. Lorsque vous activez cette fonctionnalité, vous recevrez les dernières mises à jour PowerShell 7 dans votre flux de gestion traditionnel Windows Update (WU), que ce soit avec Windows Update for Business, WSUS, SCCM ou la boîte interactive WU dans les Paramètres.
Le package PowerShell 7.2 MSI inclut les options suivantes en ligne de commande :
-
USE_MU– cette propriété a deux valeurs possibles :-
1(par défaut) - Permet de mettre à jour via Microsoft Update ou WSUS -
0- N’optez pas pour la mise à jour via Microsoft Update ou WSUS
-
ENABLE_MU-
1(par défaut) - Choisit d’utiliser Microsoft Update les mises à jour automatiques ou Windows Update -
0- N’optez pas pour l’utilisation de Microsoft Update pour les mises à jour automatiques ou Windows Update
-
Modifications du moteur
Prise en charge de PowerShell comme interpréteur de commandes Unix par défaut
Sur Unix, il s’agit d’une convention pour les interpréteurs de commandes d’accepter -i pour un interpréteur de commandes interactif et de nombreux outils attendent ce comportement (script, par exemple, et lorsque vous définissez PowerShell comme interpréteur de commandes par défaut) et appellent l’interpréteur de commandes avec le -i paramètre. Ce changement est un casse qui -i auparavant pouvait être utilisé comme abrégé pour correspondre -InputFormat, ce qui doit maintenant être -in.
Composants logiciels enfichables personnalisés
Les fichiers snap-in PowerShell sont un prédécesseur des modules PowerShell qui ne sont pas largement adoptés dans la communauté PowerShell.
En raison de la complexité de la prise en charge des composants logiciels enfichables et de leur absence d’utilisation dans la communauté, nous ne prenons plus en charge les composants logiciels enfichables personnalisés dans PowerShell.
Indicateurs de fonctionnalités expérimentales
La version 6.2 de PowerShell a activé la prise en charge des fonctionnalités expérimentales. Cela permet aux développeurs PowerShell de fournir de nouvelles fonctionnalités et d’obtenir des commentaires avant la fin de la conception. De cette façon, nous évitez d’apporter des changements cassants au fur et à mesure que la conception évolue.
Utilisez Get-ExperimentalFeature pour obtenir une liste des fonctionnalités expérimentales disponibles. Vous pouvez activer ou désactiver ces fonctionnalités avec Enable-ExperimentalFeature et Disable-ExperimentalFeature.
Charger l’assembly depuis le chemin de base du module avant d’essayer de le charger depuis le GAC
Auparavant, lorsqu’un module binaire possède l’assembly de module dans GAC, nous avons chargé l’assembly à partir du GAC avant de tenter de le charger à partir du chemin de base du module.
Ignorer la vérification de l’élément Null pour les collections avec un type d’élément de type valeur
Pour les attributs Mandatory paramètre et ValidateNotNull et ValidateNotNullOrEmpty , on saute la vérification des éléments nuls si le type d’élément de la collection est de type value.
Conserver $? pour ParenExpression, SubExpression et ArrayExpression
Cette pull request modifie la façon dont nous compilons les sous-pipelines (...), les sous-expressions $(...) et les expressions @() de tableau afin qu’$? ne soit pas automatiquement vrai. Au lieu de cela, la valeur de $? dépend du résultat du pipeline ou des instructions exécutées.
Réparer $? pour qu'il ne devienne pas $false lorsque la commande native écrit dans stderr
$? n'est pas configuré sur $false lorsque la commande native écrit dans stderr. Il est courant que les commandes natives écrivent dans stderr sans avoir l’intention d’indiquer un échec.
$? est défini sur $false uniquement lorsque la commande native a un code de sortie différent de zéro.
Faire en sorte que $ErrorActionPreference n'affecte pas stderr la sortie des commandes natives
Il est courant que les commandes natives écrivent dans stderr sans avoir l’intention d’indiquer un échec. Avec ce changement, stderr la sortie est toujours capturée dans les objets ErrorRecord, mais l’exécution ne s’applique $ErrorActionPreference plus si l’ErrorRecord provient d’une commande native.
Remplacez $OutputEncoding par l'encodage UTF-8 NoBOM au lieu d'ASCII.
L’encodage précédent, ASCII (7 bits), entraîne une modification incorrecte de la sortie dans certains cas. Faire de UTF-8 NoBOM le paramètre par défaut préserve la sortie Unicode avec un encodage pris en charge par la plupart des outils et systèmes d'exploitation.
Unifier les cmdlets avec le paramètre -Encoding pour qu'il soit de type System.Text.Encoding
La -Encoding valeur Byte a été supprimée des applets de commande du fournisseur FileSystem. Un nouveau paramètre, -AsByteStream, est désormais utilisé pour spécifier qu’un flux d’octets est requis en entrée ou que la sortie est un flux d’octets.
Modifier l’encodage New-ModuleManifest sur les plateformes non-Windows UTF8NoBOM
Auparavant, New-ModuleManifest créait psd1 des manifestes en UTF-16 avec BOM, créant un problème pour les outils Linux. Ce changement décisif modifie l’encodage de New-ModuleManifest pour qu’il devienne UTF (sans BOM) sur les plateformes non-Windows.
Supprimer AllScope de la plupart des alias par défaut
Pour accélérer la création de l’ampleur, AllScope cela a été retiré de la plupart des alias par défaut.
AllScope il a été laissé pour quelques alias fréquemment utilisés où la recherche était plus rapide.
-Verbose et -Debug ne remplace plus $ErrorActionPreference
Auparavant, si -Verbose ou -Debug étaient spécifiés, cela supprimait le comportement de $ErrorActionPreference. Avec ce changement, -Verbose et -Debug n’affectent plus le comportement de $ErrorActionPreference.
En outre, le -Debug paramètre définit $DebugPreference sur Continuer au lieu de Interroger.
Répercuter de manière cohérente $PSCulture les changements culturels en session
Dans Windows PowerShell, la valeur de la culture actuelle est mise en cache, ce qui peut entraîner un désynchronisation si la culture est modifiée après le démarrage de la session. Ce comportement de mise en cache est résolu dans PowerShell Core.
Autoriser le paramètre nommé explicitement spécifié à remplacer le même paramètre de table de hachage
Avec cette modification, les paramètres nommés issus du splatting sont déplacés vers la fin de la liste des paramètres afin de les lier après que tous les paramètres nommés explicitement spécifiés ont été liés. La liaison de paramètres pour les fonctions simples ne génère pas d’erreur lorsqu’un paramètre nommé spécifié est introuvable. Les paramètres nommés inconnus sont liés au $args paramètre de la fonction simple. Déplacer le splatting à la fin de la liste d’arguments change l’ordre dans lequel les paramètres apparaissent dans $args.
Par exemple:
function SimpleTest {
param(
$Name,
$Path
)
"Name: $Name; Path: $Path; Args: $args"
}
Dans le comportement précédent, MyPath n’est pas lié car -Path il s’agit du troisième argument de la liste d’arguments. ## Donc ça finit par être bourré dans le « $args » avec Blah = "World"
PS> $hash = @{ Name = "Hello"; Blah = "World" }
PS> SimpleTest @hash "MyPath"
Name: Hello; Path: ; Args: -Blah: World MyPath
Avec ce changement, les arguments de @hash sont déplacés à la fin de la liste des arguments.
MyPath devient le premier argument de la liste. Il est donc lié à -Path.
PS> SimpleTest @hash "MyPath"
Name: Hello; Path: MyPath; Args: -Blah: World
Modifications de langue
Opérateur de coalescence Null ??
L’opérateur de coalescence Null ?? retourne la valeur de son opérande gauche s’il n’est pas Null.
Dans le cas contraire, il évalue l’opérande droit et retourne son résultat. L’opérateur ?? n’évalue pas son opérande droit si l’opérande gauche a la valeur non Null.
$x = $null
$x ?? 100
100
Dans l’exemple suivant, l’opérande droit n’est pas évalué.
[string] $todaysDate = '1/10/2020'
$todaysDate ?? (Get-Date).ToShortDateString()
1/10/2020
Opérateur d’affectation de fusion Null ??=
L'opérateur d'affectation de coalescence null ??= attribue la valeur de son opérande de droite à son opérande de gauche uniquement si cet opérande de gauche est évalué à null. L’opérateur ??= n’évalue pas son opérande droit si l’opérande gauche a la valeur non Null.
$x = $null
$x ??= 100
$x
100
Dans l’exemple suivant, l’opérande droit n’est pas évalué.
[string] $todaysDate = '1/10/2020'
$todaysDate ??= (Get-Date).ToShortDateString()
1/10/2020
opérateurs conditionnels nuls
Note
Cette fonctionnalité a été déplacée d’expérimentale à standard dans PowerShell 7.1.
Un opérateur conditionnel Null n’applique une opération d'accès à un membre, ?., ou d'accès à un élément, ?[], à son opérande que si cet opérande a la valeur non Null ; sinon, il retourne la valeur Null.
Étant donné que PowerShell permet à ? de faire partie du nom de la variable, la spécification formelle du nom de la variable est requise pour l’utilisation de ces opérateurs. Il est donc nécessaire d’utiliser {} autour des noms de variables comme ${a} ou lorsque ? fait partie du nom ${a?}de la variable .
Dans l’exemple suivant, la valeur de PropName est retournée.
$a = @{ PropName = 100 }
${a}?.PropName
100
L’exemple suivant retourne null, sans essayer d’accéder au nom de membre PropName.
$a = $null
${a}?.PropName
De même, la valeur de l’élément sera retournée.
$a = 1..10
${a}?[0]
1
Et lorsque l’opérande a la valeur Null, l’élément n’est pas accessible et null est retourné.
$a = $null
${a}?[0]
Note
La syntaxe du nom de variable de ${<name>} ne doit pas être confondue avec l’opérateur $() de sous-expression. Pour plus d’informations, consultez la section Nom de variable about_Variables.
Ajout de l'opérateur & pour le contrôle des tâches
Mettre & à la fin d’un pipeline fait que le pipeline est exécuté comme un job PowerShell. Lorsqu’un pipeline est en arrière-plan, un objet de travail est retourné. Une fois que le pipeline fonctionne en tant que travail, tous les cmdlets standards *-Job peuvent être utilisés pour gérer le travail. Les variables (en ignorant les variables spécifiques au processus) utilisées dans le pipeline sont automatiquement copiées dans le travail, donc Copy-Item $foo $bar & ça fonctionne simplement. Le travail est également exécuté dans le répertoire actif au lieu du répertoire d’accueil de l’utilisateur.
Nouvelles méthodes/propriétés sur PSCustomObject
Nous avons ajouté de nouvelles méthodes et propriétés à PSCustomObject.
PSCustomObject inclut maintenant une Count/Length propriété comme les autres objets.
$PSCustomObject = [pscustomobject]@{foo = 1}
$PSCustomObject.Length
1
$PSCustomObject.Count
1
Ce travail inclut ForEach également des Where méthodes permettant d’opérer et de filtrer les PSCustomObject éléments :
$PSCustomObject.ForEach({$_.foo + 1})
2
$PSCustomObject.Where({$_.foo -gt 0})
foo
---
1
Conversions de PSMethod en délégué
Vous pouvez convertir un PSMethod en délégué. Cela vous permet de faire des choses comme passer PSMethod[M]::DoubleStrLen en tant que valeur déléguée dans [M]::AggregateString:
class M {
static [int] DoubleStrLen([string] $value) { return 2 * $value.Length }
static [long] AggregateString([string[]] $values, [Func[string, int]] $selector) {
[long] $res = 0
foreach($s in $values){
$res += $selector.Invoke($s)
}
return $res
}
}
[M]::AggregateString((gci).Name, [M]::DoubleStrLen)
Comportement de comparaison de chaînes modifié dans PowerShell 7.1
PowerShell 7.1 est construit sur .NET 5.0, qui a introduit le changement décisif suivant :
Depuis .NET 5.0, les comparaisons de chaînes invariantes par culture ignorent les caractères de contrôle non imprimants.
Par exemple, les deux chaînes suivantes sont considérées comme identiques :
# Escape sequence "`a" is Ctrl-G or [char]7
'Food' -eq "Foo`ad"
True
Nouvelles applets de commande
Nouvelle Get-Uptime applet de commande
L’applet de commande Get-Uptime retourne le temps écoulé depuis le dernier démarrage du système d’exploitation. L’applet de commande a été introduite dans PowerShell 6.0.
Nouvelle Remove-Alias applet de commande
L’applet de commande Remove-Alias supprime un alias de la session PowerShell actuelle. L’applet de commande a été introduite dans PowerShell 6.0.
Nouvelle Remove-Service applet de commande
L’applet de commande Remove-Service supprime un service Windows dans le Registre et dans la base de données de service. L’applet de commande Remove-Service a été introduite dans PowerShell 6.0.
Nouvelles applets de commande Markdown
Markdown est un standard pour créer des documents en texte clair lisibles avec une mise en forme de base qui peut être rendue en HTML.
Les applets de commande suivantes ont été ajoutées dans PowerShell 6.1 :
- ConvertFrom-Markdown : convertissez le contenu d’une chaîne ou d’un fichier en objet MarkdownInfo .
- Get-MarkdownOption : renvoie les couleurs et styles actuels utilisés pour le rendu du contenu Markdown dans la console.
- Set-MarkdownOption : définit les couleurs et les styles utilisés pour le rendu du contenu Markdown dans la console.
- Show-Markdown - Affiche le contenu Markdown dans la console ou au format HTML
Nouvelle Test-Json applet de commande
L’applet de commande Test-Json teste si une chaîne est un document JSON (JavaScript Object Notation) valide et peut éventuellement vérifier que le document JSON sur un schéma fourni.
Cette applet de commande a été introduite dans PowerShell 6.1
Nouvelles applets de commande pour prendre en charge les fonctionnalités expérimentales
Les applets de commande suivantes ont été ajoutées dans PowerShell 6.2 pour prendre en charge les fonctionnalités expérimentales.
Nouvelle Join-String applet de commande
L’applet de commande Join-String combine des objets du pipeline en une seule chaîne. Cette applet de commande a été ajoutée dans PowerShell 6.2.
Nouvelle vue ConciseView et applet de commande Get-Error
PowerShell 7.0 améliore l’affichage des messages d’erreur pour améliorer la lisibilité des erreurs interactives et de script avec une nouvelle vue par défaut, ConciseView. Les vues sont sélectionnables par l’utilisateur via la variable $ErrorViewde préférence .
Avec ConciseView, si une erreur ne provient pas d’une erreur de script ou d’analyseur, alors c’est un message d’erreur d’une ligne :
Get-ChildItem -Path C:\NotReal
Get-ChildItem: Can't find path 'C:\NotReal' because it doesn't exist
Si l’erreur se produit pendant l’exécution du script ou s’il s’agit d’une erreur d’analyse, PowerShell retourne un message d’erreur multiligne qui contient l’erreur, un pointeur et un message d’erreur montrant où se trouve l’erreur dans cette ligne. Si le terminal ne supporte pas les séquences d’échappement des couleurs ANSI (VT100), alors les couleurs ne sont pas affichées.
La vue par défaut dans PowerShell 7 est ConciseView. L’ancienne vue par défaut était NormalView et vous pouvez la sélectionner en définissant la variable $ErrorViewpreference.
$ErrorView = 'NormalView' # Sets the error view to NormalView
$ErrorView = 'ConciseView' # Sets the error view to ConciseView
Note
Une nouvelle propriété , ErrorAccentColor , $Host.PrivateData est ajoutée pour permettre de changer la couleur d’accent du message d’erreur.
La nouvelle Get-Errorapplet de commande fournit une vue détaillée de l’erreur entièrement qualifiée lorsqu'il est nécessaire. Par défaut, le cmdlet affiche tous les détails, y compris les exceptions internes, de la dernière erreur survenue.
Le Get-Error cmdlet prend en charge l’entrée du pipeline en utilisant la variable $Errorintégrée .
Get-Error affiche toutes les erreurs de canalisation.
$Error | Get-Error
Le Get-Error cmdlet prend en charge le paramètre Newest , vous permettant de spécifier combien d’erreurs de la session en cours vous souhaitez afficher.
Get-Error -Newest 3 # Displays the lst three errors that occurred in the session
Pour plus d’informations, consultez Get-Error.
Modifications des applets de commande
Exécution parallèle ajoutée à ForEach-Object
À compter de PowerShell 7.0, l’applet ForEach-Object de commande, qui itère les éléments d’une collection, a désormais un parallélisme intégré avec le nouveau paramètre Parallel .
Par défaut, les blocs de script parallèles utilisent le répertoire de travail courant de l’appelant qui a lancé les tâches parallèles.
Cet exemple récupère 50 000 entrées de journal à partir de 5 journaux système sur une machine Windows locale :
$logNames = 'Security','Application','System','Windows PowerShell','Microsoft-Windows-Store/Operational'
$logEntries = $logNames | ForEach-Object -Parallel {
Get-WinEvent -LogName $_ -MaxEvents 10000
} -ThrottleLimit 5
$logEntries.Count
50000
Le paramètre Parallel spécifie le bloc de script qui est exécuté en parallèle pour chaque nom de journal d’entrée.
Le nouveau paramètre ThrottleLimit limite le nombre de blocs de script qui s’exécutent en parallèle à un moment donné. La valeur par défaut est 5.
Utilisez la $_ variable pour représenter l’objet d’entrée courant dans le bloc de script. Utilisez le modificateur d’étendue Using: pour passer des références de variables au bloc de script en cours d’exécution.
Pour plus d’informations, consultez ForEach-Object.
Vérifiez system32 la présence de modules intégrés compatibles sous Windows
Dans la mise à jour de Windows 10 1809 et Windows Server 2019, nous avons mis à jour un certain nombre de modules PowerShell intégrés pour les marquer comme compatibles avec PowerShell.
Lorsque PowerShell démarre, il inclut $windir\System32 automatiquement dans le cadre de la variable d’environnement PSModulePath . Cependant, il n’expose les modules que à Get-Module et si il Import-Module est marqué comme compatible avec CompatiblePSEditionCore .
Vous pouvez contourner ce comportement pour afficher tous les modules à l’aide du -SkipEditionCheck paramètre switch.
Nous avons également ajouté une PSEdition propriété à la sortie de la table.
-lp alias pour tous les -LiteralPath paramètres
Nous avons créé un alias -lp de paramètre standard pour toutes les applets de commande PowerShell intégrées qui ont un -LiteralPath paramètre.
Corriger Get-Item -LiteralPath a*b si a*b n’existe pas réellement pour retourner une erreur
Auparavant, -LiteralPath un joker le traitait de la même façon que -Path si le joker ne trouvait aucun fichier, il sortait silencieusement. Le comportement correct doit être littéral -LiteralPath , donc si le fichier n’existe pas, il devrait provoquer une erreur. Le changement consiste à traiter les jokers utilisés -Literal comme littéraux.
Définir le répertoire de travail sur le répertoire courant dans Start-Job
L’applet Start-Job de commande utilise désormais le répertoire actif comme répertoire de travail pour le nouveau travail.
Supprimer -Protocol des cmdlets *-Computer
Le -Protocol paramètre a été supprimé des applets de commande suivantes :
Rename-ComputerRestart-ComputerStop-Computer
DCOM n’est plus pris en charge pour la communication à distance. Les applets de commande prennent uniquement en charge la communication à distance WSMAN.
Supprimer -ComputerName des cmdlets *-Service
Afin d’encourager l’utilisation cohérente du PSRP, ce -ComputerName paramètre a été retiré des *-Service cmdlets. Utilisez Invoke-Command pour exécuter les applets de commande sur des ordinateurs distants.
Corriger Get-Content -Delimiter pour ne pas inclure le délimiteur dans les lignes retournées
Auparavant, la sortie lors de l’utilisation Get-Content -Delimiter était incohérente et peu pratique car elle nécessitait un traitement supplémentaire des données pour supprimer le délimiteur. Cette modification supprime le délimiteur dans les lignes retournées.
Modifications apportées à Format-Hex
Le -Raw paramètre ne fait maintenant rien. L’applet Format-Hex de commande affiche une véritable représentation des nombres qui inclut tous les octets de son type. C’est ce que le -Raw paramètre a fait avant cette modification.
Correction de faute de frappe dans le nom de la propriété Get-ComputerInfo
BiosSerialNumber a été mal orthographié et BiosSeralNumber a été changé pour la bonne orthographe.
Modifications apportées aux algorithmes de hachage disponibles
Les algorithmes de hachage suivants ont été supprimés de .NET :
MACTripleDESRIPEMD160
Cette modification affecte l’applet Get-FileHash de commande.
Ajouter une validation sur Get-* les applets de commande où la transmission de $null retourne tous les objets au lieu d’une erreur
Passer $null à l’un des joueurs suivants affiche maintenant une erreur :
Get-Credential -UserNameGet-Event -SourceIdentifierGet-EventSubscriber -SourceIdentifierGet-Help -NameGet-PSBreakpoint -ScriptGet-PSProvider -PSProviderGet-PSSessionConfiguration -NameGet-Runspace -NameGet-RunspaceDebug -RunspaceNameGet-Service -NameGet-TraceSource -NameGet-Variable -Name
Ajouter la prise en charge du format de fichier journal étendu W3C dans Import-Csv
Auparavant, l’applet Import-Csv de commande ne peut pas être utilisée pour importer directement les fichiers journaux au format de journal étendu W3C et une action supplémentaire serait nécessaire. Avec cette modification, le format de journal étendu W3C est pris en charge.
Import-Csv s’applique pstypenames à l’importation lorsque les informations de type sont présentes dans le fichier CSV
Auparavant, les objets exportés avec Export-Csv et importés avec TypeInformation via ConvertFrom-Csv ne conservaient pas les informations de type. Ce changement ajoute les informations de type au pstypenames membre si disponible dans le fichier CSV.
-NoTypeInformation est la valeur par défaut sur Export-Csv
Auparavant, l’applet Export-Csv de commande génère un commentaire en tant que première ligne contenant le nom de type de l’objet. La modification exclut les informations de type par défaut, car elles ne sont pas comprises par la plupart des outils CSV. Cette modification a été apportée pour répondre aux commentaires des clients.
Utilisez-le -IncludeTypeInformation pour conserver le comportement précédent.
Autoriser * à être utilisé dans le chemin de Registre pour Remove-Item
Auparavant, -LiteralPath un joker le traitait de la même façon que -Path si le joker ne trouvait aucun fichier, il sortait silencieusement. Le comportement correct doit être littéral -LiteralPath , donc si le fichier n’existe pas, il devrait provoquer une erreur. Le changement consiste à traiter les jokers utilisés -Literal comme littéraux.
Group-Object trie maintenant les groupes
Dans le cadre de l’amélioration des performances, Group-Object une liste triée des groupes est désormais revue.
Bien que vous ne deviez pas compter sur l'ordre, vous pourriez être perturbé par ce changement si vous cherchiez à obtenir le premier groupe. Nous avons décidé que cette amélioration des performances valait la peine de changer, car l’impact d’être dépendant du comportement précédent est faible.
Écart-type dans Measure-Object
La sortie à partir de Measure-Object maintenant inclut une StandardDeviation propriété.
Get-Process | Measure-Object -Property CPU -AllStats
Count : 308
Average : 31.3720576298701
Sum : 9662.59375
Maximum : 4416.046875
Minimum :
StandardDeviation : 264.389544720926
Property : CPU
Get-PfxCertificate -Password
Get-PfxCertificate a maintenant le paramètre Password, qui accepte un SecureString. Cela vous permet de l’utiliser de manière non interactive :
$certFile = '\\server\share\pwd-protected.pfx'
$certPass = Read-Host -AsSecureString -Prompt 'Enter the password for certificate: '
$certThumbPrint = (Get-PfxCertificate -FilePath $certFile -Password $certPass ).ThumbPrint
Suppression de la more fonction
Par le passé, PowerShell proposait une fonction sur Windows appelée more qui encapsulait more.com. Cette fonction a maintenant été supprimée.
De plus, la help fonction a été modifiée pour être utilisée more.com sous Windows, ou sur le pager par défaut du système spécifié par $Env:PAGER sur des plateformes non-Windows.
cd DriveName: Ça renvoie maintenant les utilisateurs au répertoire de travail courant dans ce lecteur
Auparavant, utiliser Set-Location ou cd pour retourner vers un PSDrive envoyait les utilisateurs à l’emplacement par défaut de ce disque. Les utilisateurs sont désormais envoyés au dernier répertoire de travail actuel connu pour cette session.
cd - Retour au répertoire précédent
C:\Windows\System32> cd C:\
C:\> cd -
C:\Windows\System32>
Ou sur Linux :
PS /etc> cd /usr/bin
PS /usr/bin> cd -
PS /etc>
Aussi, cd et cd -- changez en $HOME.
Update-Help en tant que non-administrateur
À la demande populaire, il Update-Help n’est plus nécessaire d’être géré en tant qu’administrateur.
Update-Help Par défaut, il faut sauvegarder l’aide dans un dossier à portée utilisateur.
Where-Object -Not
Avec l’ajout du paramètre -Not à Where-Object, vous pouvez filtrer un objet dans le pipeline pour vérifier l'absence d’une propriété ou qu'une propriété ait une valeur nulle/vide.
Par exemple, cette commande retourne tous les services qui n’ont pas de services dépendants définis :
Get-Service | Where-Object -Not DependentServices
Modifications apportées aux applets de commande web
L’API .NET sous-jacente des commandes Web a été modifiée en System.Net.Http.HttpClient. Cette modification offre de nombreux avantages. Cependant, ce changement, ainsi qu’un manque d’interopérabilité avec Internet Explorer, ont entraîné plusieurs changements marquants dans Invoke-WebRequest et Invoke-RestMethod.
-
Invoke-WebRequestprend désormais en charge uniquement l’analyse HTML basique.Invoke-WebRequestOn retourne toujours unBasicHtmlWebResponseObjectobjet. LesParsedHtmlpropriétés etFormsont été retirées. -
BasicHtmlWebResponseObject.Headersles valeurs sont maintenantString[]au lieu deString. -
BasicHtmlWebResponseObject.BaseResponseest désormais unSystem.Net.Http.HttpResponseMessageobjet. - La
Responsepropriété sur les exceptions Web Cmdlet est désormais unSystem.Net.Http.HttpResponseMessageobjet. - L’analyse stricte des en-têtes RFC est désormais par défaut pour le
-Headersparamètre et-UserAgent. Cela peut être contourné par-SkipHeaderValidation. -
file://etftp://les schémas URI ne sont plus pris en charge. -
System.Net.ServicePointManagerLes lieux ne sont plus respectés. - Il n’existe actuellement aucune authentification basée sur un certificat disponible sur macOS.
- L’utilisation de plus d’une
-Credentialhttp://URI entraînera une erreur. Utilisez unehttps://URI ou fournissez le-AllowUnencryptedAuthenticationparamètre pour supprimer l’erreur. -
-MaximumRedirectionProduit maintenant une erreur de terminaison lorsque les tentatives de redirection dépassent la limite fournie au lieu de retourner les résultats de la dernière redirection. - Dans PowerShell 6.2, une modification a été apportée à l’encodage UTF-8 par défaut pour les réponses JSON. Lorsqu’un ensemble de caractères n’est pas fourni pour une réponse JSON, l’encodage par défaut doit être UTF-8 par RFC 8259.
- Encodage par défaut défini sur UTF-8 pour les réponses
application-json - Paramètre ajouté
-SkipHeaderValidationpour autoriserContent-Typeles en-têtes qui ne sont pas conformes aux normes - Ajout du
-Formparamètre pour prendre en chargemultipart/form-datasimplifié - Gestion conforme et insensible à la casse des clés de relation
- Paramètre ajouté
-Resumepour les applets de commande web
Invoke-RestMethod retourne des informations utiles lorsqu’aucune donnée n’est retournée
Lorsqu’une API retourne juste null, Invoke-RestMethod sérialise cela en tant que chaîne "null" au lieu de $null. Ce changement fixe la logique de Invoke-RestMethod pour sérialiser correctement un littéral JSON null valide à valeur unique comme $null.
Les applets de commande web avertissent lorsque -Credential est envoyé via des connexions non chiffrées
Lorsque vous utilisez HTTP, le contenu incluant les mots de passe est envoyé en texte clair. Cette modification n’est pas autorisée par défaut et retourne une erreur si les informations d’identification sont transmises de manière non sécurisée. Les utilisateurs peuvent contourner cela en utilisant le -AllowUnencryptedAuthentication commutateur.
Rendre le paramètre -OutFile des applets de commande web à fonctionner comme -LiteralPath.
À compter de PowerShell 7.1, le paramètre OutFile des applets de commande web fonctionne comme LiteralPath et ne traite pas les caractères génériques.
Modifications d'API
Supprimer AddTypeCommandBase la classe
La AddTypeCommandBase classe a été retirée Add-Type pour améliorer les performances. Cette classe est utilisée uniquement par l’applet Add-Type de commande et ne doit pas avoir d’impact sur les utilisateurs.
Supprimé VisualBasic comme langue prise en charge dans Add-Type
Autrefois, on pouvait compiler du code Visual Basic avec le Add-Type cmdlet. Visual Basic était rarement utilisé avec Add-Type. Nous avons supprimé cette fonctionnalité pour réduire la taille de PowerShell.
Suppression de la prise en charge RunspaceConfiguration
Auparavant, lors de la création d’un runspace PowerShell par programmation à l’aide de l’API, vous pouvez utiliser l’ancienne RunspaceConfiguration ou les classes plus récentes InitialSessionState . Ce changement a supprimé le support pour RunspaceConfiguration et ne prend InitialSessionStateen charge que .
CommandInvocationIntrinsics.InvokeScript lier des arguments à la $input place de $args
Une position incorrecte d’un paramètre a entraîné le passage des arguments en tant qu’entrée au lieu d’arguments.
Supprimer les propriétés ClrVersion et BuildVersion de $PSVersionTable
La ClrVersion propriété de $PSVersionTable n’est pas utile avec CoreCLR. Les utilisateurs finaux ne doivent pas utiliser cette valeur pour déterminer la compatibilité.
La BuildVersion propriété a été liée à la version de build Windows, qui n’est pas disponible sur les plateformes non-Windows. Utilisez la GitCommitId propriété pour récupérer la version de build exacte de PowerShell.
Implémenter l’analyse d’échappement Unicode
`u#### ou `u{####} est converti en caractère Unicode correspondant. Pour produire un littéral `u, échappez au backtick : ``u.
Problème de liaison de paramètre avec ValueFromRemainingArguments dans les fonctions PS
ValueFromRemainingArguments Il retourne maintenant les valeurs sous forme de tableau au lieu d’une seule valeur qui est elle-même un tableau.
Utilisations nettoyées de CommandTypes.Workflow et WorkflowInfoCleaned
Nettoyez le code lié aux utilisations de CommandTypes.Workflow et WorkflowInfo dans System.Management.Automation.
Ces changements cassants mineurs affectent principalement le code du fournisseur d’aide.
- Modifiez les constructeurs publics de
WorkflowInfoen internes. Nous ne prenons plus en charge le flux de travail. Il est donc judicieux de ne pas autoriser les utilisateurs à créerWorkflowdes instances. - Supprimez le type System.Management.Automation.DebugSource , car il est utilisé uniquement pour le débogage de flux de travail.
- Supprimez la surcharge de
SetParentde la classe abstraite Debugger, utilisée uniquement pour le débogage de workflows. - Supprimez la même surcharge de
SetParentde la classe dérivée RemotingJobDebugger.
Ne pas encapsuler la valeur de retour dans PSObject lors de la conversion d’un ScriptBlock en délégué
Lorsque a ScriptBlock est converti en type délégué à utiliser dans le contexte C#, envelopper le résultat dans a PSObject apporte des problèmes inutiles :
- Lorsque la valeur est convertie en type de retour délégué, le
PSObjectdéplié est essentiellement déplié. Donc c’estPSObjectinutile. - Lorsque le type de retour de délégué est
object, il est enveloppé dans unPSObject, ce qui rend le travail difficile à utiliser en C#.
Après ce changement, l’objet retourné devient l’objet sous-jacent.
Soutien à distance
PowerShell Remoting (PSRP) utilisant WinRM n’est pas pris en charge pour les plateformes non Windows. Vous pouvez utiliser PowerShell Remoting (PSRP) sur WinRM à partir de Windows pour vous connecter à d’autres ordinateurs Windows. PowerShell prend également en charge la communication à distance sur SSH sur toutes les plateformes (Windows, macOS et Linux). Pour plus d’informations, consultez la communication à distance SSH dans PowerShell.
PowerShell Direct pour conteneurs tente d’utiliser pwsh en premier
PowerShell Direct est une fonctionnalité de PowerShell et Hyper-V qui permet de vous connecter à une VM ou un conteneur Hyper-V sans connectivité réseau ni autres services de gestion à distance.
Dans le passé, PowerShell Direct est connecté à l’aide de l’instance Windows PowerShell intégrée sur le conteneur. Maintenant, PowerShell Direct tente d’abord de se connecter en utilisant n’importe quelle variable d’environnement pwsh.exe disponiblePATH. Si pwsh.exe ce n’est pas disponible, PowerShell Direct revient à utiliser powershell.exe.
Enable-PSRemoting Crée désormais des points de terminaison à distance séparés pour les versions d’aperçu
Enable-PSRemoting Crée maintenant deux configurations de session à distance :
- Une pour la version principale de PowerShell. Par exemple :
PowerShell.6. Ce point de terminaison qui peut être basé sur des mises à jour de version mineures en tant que configuration de session PowerShell 6 à l’échelle du système - Une configuration de session spécifique à chaque version, par exemple :
PowerShell.6.1.0
Ce comportement est utile si vous souhaitez que plusieurs versions de PowerShell 6 soient installées et accessibles sur le même ordinateur.
De plus, les versions preview de PowerShell bénéficient désormais de leurs propres configurations de session à distance après avoir exécuté le Enable-PSRemoting cmdlet :
C:\WINDOWS\system32> Enable-PSRemoting
Votre sortie peut être différente si vous n’avez pas configuré WinRM avant.
WinRM is already set up to receive requests on this computer.
WinRM is already set up for remote management on this computer.
Vous pouvez ensuite voir des configurations de session PowerShell distinctes pour la préversion et les builds stables de PowerShell 6, et pour chaque version spécifique.
Get-PSSessionConfiguration
Name : PowerShell.6.2-preview.1
PSVersion : 6.2
StartupScript :
RunAsUser :
Permission : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed
Name : PowerShell.6-preview
PSVersion : 6.2
StartupScript :
RunAsUser :
Permission : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed
Name : powershell.6
PSVersion : 6.1
StartupScript :
RunAsUser :
Permission : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed
Name : powershell.6.1.0
PSVersion : 6.1
StartupScript :
RunAsUser :
Permission : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed
user@host:port syntaxe prise en charge pour SSH
Les clients SSH prennent généralement en charge une chaîne de connexion au format user@host:port. Avec l’ajout de SSH en tant que protocole pour la communication à distance PowerShell, nous avons ajouté la prise en charge de ce format de chaîne de connexion :
Enter-PSSession -HostName fooUser@ssh.contoso.com:2222
La télémétrie ne peut être désactivée qu’avec une variable d’environnement
PowerShell envoie des données de télémétrie de base à Microsoft lors du lancement. Les données incluent le nom du système d’exploitation, la version du système d’exploitation et la version de PowerShell. Ces données nous permettent de mieux comprendre les environnements où PowerShell est utilisé et nous permet de hiérarchiser les nouvelles fonctionnalités et correctifs.
Pour refuser la collecte de ces données de télémétrie, définissez la variable d’environnement POWERSHELL_TELEMETRY_OPTOUT sur true, yes ou 1. Nous ne supportons plus la suppression du fichier DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY pour désactiver la télémétrie.