Partager via


Nouveautés de PowerShell 7.5

PowerShell 7.5.4 inclut les fonctionnalités, mises à jour et changements majeurs suivants. PowerShell 7.5.4 repose sur la version .NET 9.0.306.

Pour obtenir la liste complète des changements, consultez CHANGELOG dans le dépôt GitHub. Pour plus d’informations sur .NET 9, consultez Nouveautés de .NET 9.

Changements cassants

  • Correction des paramètres -OlderThan et -NewerThan pour Test-Path lors de l’utilisation de PathType et de la plage de dates (#20942) (merci à @ArmaanMcleod!)
    • Auparavant, -OlderThan était ignoré si les deux paramètres étaient spécifiés ensemble
  • Définition de 2 comme valeur par défaut de New-FileCatalog -CatalogVersion (#20428) (merci à @ThomasNieto!)
  • Blocage de l’accès à l’aide en ligne depuis des emplacements réseau dans les sessions distantes restreintes (#20593)
  • Le programme d’installation Windows se souvient désormais des options d’installation utilisées et les emploie pour initialiser les options de l’installation suivante (#20420) (merci à @reduckted!)
  • ConvertTo-Json sérialise maintenant BigInteger en tant que nombre (#21000) (merci @jborean93!)

Modules mis à jour

PowerShell 7.5.4 inclut les modules mis à jour suivants :

  • Microsoft.PowerShell.PSResourceGet v1.1.1
  • PSReadLine v2.3.6

Amélioration de la saisie semi-automatique par tabulation

Un grand merci à @ArmaanMcleod et à tous les autres pour leur travail visant à améliorer la saisie semi-automatique.

  • Repli vers l’inférence de type si la clé-valeur hashtable ne peut pas être extraite depuis une expression sécurisée (#21184) (Merci à @MartinGC94!)
  • Correction de la régression lors d’une opération d’inférence de type pour $_ (#21223) (merci à @MartinGC94!)
  • Expansion du ~ en $HOME sous Windows avec la saisie semi-automatique (#21529)
  • Pas de saisie semi-automatique lors de la déclaration d’un nom de paramètre et de membre de classe (#21182) (Merci à @MartinGC94!)
  • Empêche le repli vers la saisie semi-automatique de fichiers lors de la saisie semi-automatique de noms de types (#20084) (Merci à @MartinGC94)
  • Ajout d’un d’argument completer -Version pour Set-StrictMode (#20554) (Merci à @ArmaanMcleod!)
  • Ajout d’un d’argument de compléteur -Verb pour Get-Verb/ Get-Command et refactorisation de Get-Verb (#20286) (merci à @ArmaanMcleod)
  • Ajout d’un compléteur d’argument -Verb pour Start-Process (#20415) (merci à @ArmaanMcleod)
  • Ajout d’un d’argument de compléteur -Scope pour les commandes *-Variable, *-Alias et *-PSDrive (#20451) (merci à @ArmaanMcleod)
  • Ajout de la saisie semi-automatique -Module pour les commandes Save-Help/Update-Help (#20678) (Merci à @ArmaanMcleod))

Nouvelles applets de commande

  • Ajout des cmdlets ConvertTo-CliXml et ConvertFrom-CliXml (#21063) (merci @ArmaanMcleod!)

Améliorations apportées aux cmdlets web

  • Correction permettant à -PassThru et -Outfile de fonctionner ensemble (#24086)
  • Ajoutez la propriété OutFile dans WebResponseObject (#24047)
  • Afficher le nom de fichier dans Invoke-WebRequest -OutFile -Verbose (#24041)
  • Correction de WebCmdlets quand -Body est spécifié, mais que ContentType ne l’est pas (#23952) (merci à @CarloToso!)
  • Correction de Invoke-WebRequest afin qu’il signale la taille correcte quand -Resume est spécifié (#20207) (merci à @LNKLEO!)
  • Correction des cmdlets web pour permettre aux applications WinForm de fonctionner correctement (#20606)

Autres améliorations apportées aux cmdlet

  • Corriger Out-GridView en remplaçant l’utilisation de l’obsolète BinaryFormatter par l’implémentation personnalisée (#25559)
  • Correctif de -NoRestart pour fonctionner avec Register-PSSessionConfiguration (#23891)
  • Ajout des options IgnoreComments et AllowTrailingCommas à la cmdlet Test-Json (#23817) (merci à @ArmaanMcleod!)
  • Get-Help peut signaler des paramètres avec l’attribut ValueFromRemainingArguments, étant compatible avec le pipeline (#23871)
  • Modification du type de LineNumber en ulong dans Select-String (#24075) (merci à @Snowman-25!)
  • Get-Process : suppression de l’exigence administrateur pour -IncludeUserName (#21302) (merci à @jborean93!)
  • Correction de Test-Path -IsValid pour la vérification de caractères de nom de fichier et de chemin d’accès incorrects (#21358)
  • Ajout de RecommendedAction dans la ConciseView du rapport d’erreur (#20826) (merci à @JustinGrote!)
  • Barre de progression ajoutée pour la cmdlet Remove-Item (#20778) (merci à @ArmaanMcleod!)
  • Correction de Test-Connection suite aux modifications de .NET 8 (#20369)
  • Correction du message d’erreur d'absence de fin d’exécution Get-Service de façon à inclure la catégorie (#20276)
  • Ajout des paramètres -Empty et -InputObject à New-Guid (#20014) (merci à @CarloToso!)
  • Ajout de l’alias r au paramètre -Recurse de la commande Get-ChildItem (#20100) (merci à @kilasuit!)
  • Ajout de LP aux alias LiteralPath pour les fonctions qui en étaient dépourvues (#20820)
  • Ajout d’une valeur de secours de localisation implicite à Import-LocalizedData (#19896) (merci à @chrisdent-de!)
  • Ajout de Aliases aux propriétés affichées lors de la mise en forme du contenu d’aide du paramètre retourné par Get-Help (#20994)
  • Ajout de HelpUri à Remove-Service (#20476)
  • Correction du plantage de la saisie semi-automatique pour le fournisseur SCCM (#20815, #20919, #20915) (Merci à @MartinGC94!))
  • Correction de la régression dans Get-Content lorsque -Tail 0 et -Wait sont utilisés ensemble (#20734) (merci à @CarloToso!)
  • Correction de Start-Process -PassThru afin de veiller à ce que la propriété ExitCode soit accessible pour l’objet Process retourné (#20749) (merci à @CodeCyclone!)
  • Correction de Group-Object pour qu’il utilise la culture actuelle pour sa sortie (#20608)
  • Correction de la sortie de Group-Object à l’aide de chaînes interpolées (#20745) (merci à @mawosoft!)
  • Correction du rendu de DisplayRoot pour le réseau PSDrive (#20793)
  • Correction de la progression de Copy-Item de manière à afficher l’achèvement uniquement lorsque tous les fichiers sont copiés (#20517)
  • Correction d’une régression sur la saisie semi-automatique des chemins UNC (#20419) (Merci à @MartinGC94!)
  • Signalement d’une erreur si un -ExecutionPolicy non valide est transmis à pwsh (#20460)
  • Ajouter les modules WinGetCommandNotFound et CompletionPredictor pour suivre l’utilisation (#21040)
  • Ajouter le paramètre DateKind à ConvertFrom-Json (#20925) (merci à @jborean93!)
  • Ajouter DirectoryInfo dans le OutputType pour New-Item (#21126) (merci à @MartinGC94!)
  • Correction de la sérialisation de valeurs de tableau Get-Error (#21085) (merci à @jborean93!)
  • Correction de Test-ModuleManifest afin qu’il puisse utiliser un chemin UNC (#24115)
  • Correction de Get-TypeData pour qu’il écrive directement dans le pipeline au lieu de collecter d’abord les données (#24236) (Merci à @MartinGC94)
  • Ajout d’un paramètre -Force aux cmdlets Resolve-Path et Convert-Path pour prendre en charge les fichiers masqués génériques #20981 (merci à @ArmaanMcleod!)
  • Définir des handles standard explicitement lors du démarrage d’un processus avec -NoNewWindow (#25324)
  • Les membres d'instance protégés internes sont désormais hérités dans l'étendue de la classe. (#25547) (Merci @mawosoft!)
  • Supprimez l’ancienne suggestion approximative et corrigez la suggestion de nom de fichier de script local (#25330)
  • Corriger la méthode PSMethodInvocationConstraints.GetHashCode (#25306) (Merci @crazyjncsu!)

Améliorations apportées au moteur

  • Déplacement de la journalisation des appels de méthode .NET après avoir effectué la conversion de type requise pour les arguments de méthode (#25357)
  • Revenir à AppLocker après WldpCanExecuteFile (#25305)
  • Activation/désactivation explicite des couleurs ANSI pour les erreurs (#24065) (Merci à @JustinGrote!))
  • Amélioration de la définition de surcharge .NET des méthodes génériques (#21326) (merci à @jborean93!)
  • Optimisation de l’opération += d’une collection lorsqu’il s’agit d’un tableau d’objets (#23901) (merci à @jborean93!)
  • Ajout de la télémétrie pour vérifier la présence de balises spécifiques lors de l’importation d’un module (#20371)
  • Ajout de PSAdapter et ConsoleGuiTools à la liste verte de télémétrie du module (#20641)
  • Ajouter un module WinGet pour suivre l’utilisation (#21040)
  • Vérification que le nom de fichier n’est pas nul lors de la journalisation des événements ETW WDAC (#20910) (merci à @jborean93!)
  • Correction de quatre régressions introduites par la fonctionnalité de journalisation WDAC (#20913)
  • Mes handles d’entrée, de sortie et d’erreur sont désormais laissés non définis lorsqu’ils ne sont pas redirigés (#20853)
  • Correction des cmdlets de proxy de communication à distance implicite pour qu’ils agissent sur des paramètres communs (#20367)
  • Inclusion de la version du module dans les messages d’erreur lorsque le module est introuvable (#20144) (merci à @ArmaanMcleod!)
  • Correction de unixmode pour gérer setuid et sticky quand le fichier n’est pas un exécutable (#20366)
  • Correction de l’utilisation d’un assembly pour qu’il utilise Path.Combine lors de la construction des chemin d’accès d’assembly (#21169)
  • Validation de la valeur pour l’utilisation d’un espace de noms pendant des vérifications sémantiques pour empêcher la déclaration d'espaces de noms invalides (#21162)
  • Gestion spéciale des outils globaux lors de l’ajout de $PSHOME au PATH (#24228)

Fonctionnalités expérimentales

Les fonctionnalités expérimentales suivantes ont été converties en fonctionnalités principales dans PowerShell 7.5-rc.1 :

Les fonctionnalités expérimentales suivantes sont incluses dans PowerShell 7.5-rc.1 :

Amélioration des performances

PowerShell 7.5-rc.1 inclut PR#23901 de @jborean93 qui améliore les performances de l’opération += pour un tableau d’objets.

L’exemple suivant mesure les performances de différentes méthodes pour ajouter des éléments à un tableau.

$tests = @{
    'Direct Assignment' = {
        param($count)

    $result = foreach($i in 1..$count) {
            $i
        }
    }
    'List<T>.Add(T)' = {
        param($count)

        $result = [Collections.Generic.List[int]]::new()
        foreach($i in 1..$count) {
            $result.Add($i)
        }
    }
    'Array+= Operator' = {
        param($count)

        $result = @()
        foreach($i in 1..$count) {
            $result += $i
        }
    }
}

5kb, 10kb | ForEach-Object {
    $groupResult = foreach($test in $tests.GetEnumerator()) {
        $ms = (Measure-Command { & $test.Value -Count $_ }).TotalMilliseconds

        [pscustomobject]@{
            CollectionSize    = $_
            Test              = $test.Key
            TotalMilliseconds = [Math]::Round($ms, 2)
        }

        [GC]::Collect()
            [GC]::WaitForPendingFinalizers()
    }

    $groupResult = $groupResult | Sort-Object TotalMilliseconds
        $groupResult | Select-Object *, @{
            Name       = 'RelativeSpeed'
            Expression = {
                $relativeSpeed = $_.TotalMilliseconds / $groupResult[0].TotalMilliseconds
                $speed = [Math]::Round($relativeSpeed, 2).ToString() + 'x'
                if ($speed -eq '1x') { $speed } else { $speed + ' slower' }
            }
        } | Format-Table -AutoSize
}

Lorsque vous exécutez le script dans PowerShell 7.4.6, vous constatez que l’utilisation de l’opérateur += est la méthode la plus lente.

CollectionSize Test                TotalMilliseconds RelativeSpeed
-------------- ----                ----------------- -------------
          5120 Direct Assignment                4.17 1x
          5120 List<T>.Add(T)                  90.79 21.77x slower
          5120 Array+= Operator               342.58 82.15x slower


CollectionSize Test                TotalMilliseconds RelativeSpeed
-------------- ----                ----------------- -------------
         10240 Direct Assignment                0.64 1x
         10240 List<T>.Add(T)                 184.10 287.66x slower
         10240 Array+= Operator              1668.13 2606.45x slower

Lorsque vous exécutez le script dans PowerShell 7.5-rc.1, vous constatez que l’utilisation de l’opérateur += est beaucoup plus rapide que dans PowerShell 7.4.6. Désormais, elle est également plus rapide que l’utilisation de la méthode List<T>.Add(T).

CollectionSize Test                TotalMilliseconds RelativeSpeed
-------------- ----                ----------------- -------------
          5120 Direct Assignment                4.71 1x
          5120 Array+= Operator                40.42 8.58x slower
          5120 List<T>.Add(T)                  92.17 19.57x slower


CollectionSize Test                TotalMilliseconds RelativeSpeed
-------------- ----                ----------------- -------------
         10240 Direct Assignment                1.76 1x
         10240 Array+= Operator               104.73 59.51x slower
         10240 List<T>.Add(T)                 173.00 98.3x slower