Freigeben über


Neuerungen in PowerShell 7.5

PowerShell 7.5-rc.1 umfasst die folgenden Features, Updates und Breaking Changes. PowerShell 7.5 basiert auf .NET 9.0.100 GA-Version.

Eine umfassende Liste der Änderungen finden Sie im Änderungsprotokoll im GitHub-Repository.

Aktuelle Änderungen

  • Die Parameter -OlderThan und -NewerThan werden für Test-Path bei Verwendung von PathType und des Datumsbereichs behoben. (#20942) (Danke an @ArmaanMcleod!)
    • Zuvor wäre -OlderThan ignoriert worden, wenn diese zusammen angegeben worden wären.
  • Ändern Sie den Standardwert New-FileCatalog -CatalogVersion in 2 (#20428) (Danke an @ThomasNieto!)
  • Blockieren von Hilfe von Netzwerkstandorten in eingeschränkten Remotingsitzungen (#20593)
  • Das Windows-Installationsprogramm merkt sich jetzt die verwendeten Installationsoptionen und verwendet sie zum Initialisieren von Optionen für die nächste Installation (#20420) (Vielen Dank @reduckted!)
  • ConvertTo-Json serialisiert BigInteger jetzt als Zahl (#21000) (Danke @jborean93!)

Aktualisierte Module

PowerShell 7.5-rc.1 enthält die folgenden aktualisierten Module:

  • Microsoft.PowerShell.PSResourceGet v1.1.0-RC2
  • PSReadLine v2.3.6

Verbesserungen bei der TAB-Vervollständigung

Vielen Dank an @ArmaanMcleod und alle anderen für die Verbesserung der Vervollständigung mit der TAB-Taste.

  • Fall back to type inference when hashtable key-value cannot be retrieved from safe expression (#21184) (Thanks @MartinGC94!)
  • Beheben der Regression beim Ausführen der Typrückleitung für $_ (#21223) (Danke) @MartinGC94!)
  • Erweitern ~ auf $home Windows mit Abschluss der Registerkarte (#21529)
  • Führen Sie den Vorgang beim Deklarieren des Parameternamens und des Klassenmememers (#21182) (Danke) nicht aus. @MartinGC94!)
  • Verhinderung eines Fallbacks auf den Dateiabschluss bei Vervollständigung mit der TAB-TASTE bei Typnamen (#20084) (Danke an @MartinGC94)
  • Argumentvervollständigung zu -Version für Set-StrictMode hinzugefügt (#20554) (Danke an @ArmaanMcleod!)
  • -Verb-Argumentvervollständigung für Get-Verb/ Get-Command hinzugefügt und Get-Verb umgestaltet (#20286) (Danke an @ArmaanMcleod)
  • -Verb-Argumentvervollständigung für Start-Process hinzugefügt (#20415) (Danke an @ArmaanMcleod)
  • -Scope-Argumentvervollständigung für die Befehle *-Variable, *-Alias und *-PSDrive hinzugefügt (#20451) (Danke an @ArmaanMcleod)
  • -Module-Abschluss für die Save-Help/Update-Help-Befehle hinzugefügt (#20678) (Danke @ArmaanMcleod)

Neue Cmdlets

  • Hinzufügen der Cmdlets ConvertTo-CliXml und ConvertFrom-CliXml (#21063) (Danke an @ArmaanMcleod!)

Verbesserungen bei Web-Cmdlets

  • Behebung, um -PassThru und -Outfile zusammenarbeiten zu lassen (#24086)
  • Hinzufügen der Eigenschaft OutFile in WebResponseObject (#24047)
  • Dateiname in Invoke-WebRequest -OutFile -Verbose anzeigen (#24041)
  • Problembehebung für WebCmdlets, wenn -Body angegeben ist, aber ContentType nicht (#23952) (Danke an @CarloToso!)
  • Behoben: Invoke-WebRequest zeigt nun die richtige Größe an, wenn -Resume angegeben wird (#20207) (Danke an @LNKLEO!).
  • Behoben: Web-Cmdlets lassen nun zu, dass WinForm-Apps ordnungsgemäß arbeiten (#20606).

Weitere Verbesserungen an Cmdlets

  • Ermöglichen, dass -NoRestart mit Register-PSSessionConfiguration funktioniert (#23891)
  • Hinzufügen der Optionen IgnoreComments und AllowTrailingCommas zum Cmdlet Test-Json (#23817) (Danke an @ArmaanMcleod!)
  • Get-Help meldet Parameter mit dem Attribut ValueFromRemainingArguments möglicherweise als pipelinefähig (#23871)
  • Ändern des Typs LineNumber von ulong in Select-String (#24075) (Danke an @Snowman-25!)
  • Get-Process: Administratoranforderung für -IncludeUserName (#21302) entfernen (Vielen Dank @jborean93!)
  • Fehler Test-Path -IsValid beim Überprüfen auf ungültige Pfad- und Dateinamenzeichen (#21358)
  • Hinzufügen RecommendedAction zur ConciseView Fehlerberichterstattung (#20826) (Danke @JustinGrote!)
  • Statusleiste für Remove-Item Cmdlet (#20778) hinzugefügt (Danke) @ArmaanMcleod!)
  • Behoben: Test-Connection aufgrund von .NET 8-Änderungen (#20369)
  • Behoben: Get-Service-Fehlermeldung ohne Abbruch, um die Kategorie einzuschließen (#20276)
  • Zu -Empty werden die Parameter -InputObject und New-Guid hinzugefügt. (#20014) (Vielen Dank an @CarloToso!))
  • Der Alias r wird dem Parameter -Recurse für den Get-ChildItem-Befehl hinzugefügt (#20100) (Danke an @kilasuit!).
  • LP wird den LiteralPath-Aliasen hinzugefügt, da Funktionen dies nicht aufweisen (#20820).
  • Lokalisierungsfallback wird Import-LocalizedData hinzugefügt (#19896) (Danke an @chrisdent-de!).
  • Aliases wird den Eigenschaften hinzugefügt, die angezeigt werden, wenn der Hilfeinhalt des von Get-Help zurückgegebenen Parameters formatiert wird (#20994).
  • HelpUri wird zu Remove-Service hinzugefügt (#20476).
  • Behoben: Abschlussabsturz für den SCCM-Anbieter (#20815, #20919, #20915) (Danke an @MartinGC94!)
  • Behoben: Regression in Get-Content, wenn -Tail 0 und -Wait zusammen verwendet werden (#20734) (Danke an @CarloToso!)
  • Behoben: Start-Process -PassThru, um sicherzustellen, dass das Objekt ExitCode auf die Eigenschaft Process zugreifen kann (#20749) (Danke an @CodeCyclone!).
  • Behoben: Group-Object verwendet nun aktuelle Kultur für die Ausgabe (#20608).
  • Behoben: Group-Object-Ausgabe verwendet interpolierte Zeichenfolge (#20745) (Danke an @mawosoft!).
  • Behoben: Rendering von DisplayRoot für das Netzwerk PSDrive (#20793)
  • Behoben: Copy-Item-Fortschritt wird nur als abgeschlossen angezeigt, wenn alle Dateien kopiert wurden (#20517).
  • Behoben: Regression des UNC-Pfadabschlusses (#20419) (Danke an @MartinGC94!)
  • Fehlermeldung, wenn ungültige -ExecutionPolicy an pwsh übergeben wird (#20460)
  • Hinzufügen der Module WinGetCommandNotFound und CompletionPredictor zum Nachverfolgen der Nutzung (#21040)
  • Hinzufügen des Parameters DateKind zu ConvertFrom-Json (#20925) (Vielen Dank an @jborean93!)
  • Hinzufügen von DirectoryInfo zum „OutputType“ für „New-Item“ (#21126) (Vielen Dank an @MartinGC94!)
  • Problembehebung für Get-Error-Serialisierung von Arraywerten (#21085) (Danke an @jborean93!)
  • Problembehebung für Test-ModuleManifest, damit ein UNC-Pfad verwendet werden kann (#24115)
  • Problembehebung für Get-TypeData, damit sofort in die Pipeline geschrieben wird, anstatt zuerst Daten zu sammeln (#24236) (Danke an @MartinGC94)
  • Hinzufügen des Parameters -Force zu den Cmdlets Resolve-Path und Convert-Path zur Unterstützung ausgeblendeter Platzhalterdateien #20981 (Danke an @ArmaanMcleod!)

Engine-Verbesserungen

  • Explizites Starten und Beenden der ANSI-Fehlerfarbe (#24065) (Danke an @JustinGrote!)
  • Verbessern der .NET-Überladungsdefinition generischer Methoden (#21326) (Danke an @jborean93!)
  • Optimieren des Vorgangs += für eine Auflistung, wenn es sich um ein Objektarray handelt (#23901) (Danke an @jborean93!)
  • Hinzufügen von Telemetrie, um beim Importieren eines Moduls nach bestimmten Tags zu suchen (#20371)
  • Hinzufügen von PSAdapter und ConsoleGuiTools zum Laden der Telemetriepositivliste des Moduls (#20641)
  • Hinzufügen des Winget-Moduls zum Nachverfolgen der Nutzung (#21040)
  • Sicherstellen, dass der Dateiname nicht NULL ist, wenn WDAC ETW-Ereignisse protokolliert werden (#20910) (Danke an @jborean93!)
  • Behoben: Vier Regressionen, die vom WDAC-Protokollierungsfeature eingeführt wurden (#20913)
  • Eingabe-, Ausgabe- und Fehlerhandles bleiben nicht festgelegt, wenn sie nicht weitergeleitet werden (#20853).
  • Behoben: Implizite Remotingproxy-Cmdlets, die auf allgemeine Parameter reagieren (#20367)
  • Modulversion wird in Fehlermeldungen hinzugefügt, wenn das Modul nicht gefunden wird (#20144) (Danke an @ArmaanMcleod!)
  • Behoben: unixmode zur Verarbeitung von setuid und sticky, wenn Datei keine ausführbare Datei ist (#20366)
  • Fix mit Assembly zum Verwenden von Path.Combine beim Erstellen von Assemblypfaden (#21169)
  • Überprüfen des Werts für die Verwendung von Namespaces während semantischer Überprüfungen, um die Deklarierung von ungültigen Namespaces zu verhindern (#21162)
  • Handhabung des globalen Tools speziell beim Voranstellen von $PSHome in PATH (#24228)

Experimentelle Features

Die folgenden experimentellen Features wurden in Mainstream-Features in PowerShell 7.5-rc.1 konvertiert:

Die folgenden experimentellen Features sind in PowerShell 7.5-rc.1 enthalten:

Leistungsverbesserungen

PowerShell 7.5-rc.1 enthielt PR#23901 von @jborean93, wodurch die Leistung der +=-Operation für ein Objektarray verbessert wird.

Das folgende Beispiel misst die Leistung für verschiedene Methoden zum Hinzufügen von Elementen zu einem Array.

$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
}

Wenn Sie das Skript in PowerShell 7.4.6 ausführen, sehen Sie, dass die Verwendung des +=-Operators die langsamste Methode ist.

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

Wenn Sie das Skript in PowerShell 7.5-rc.1 ausführen, sehen Sie, dass die Verwendung des +=-Operators wesentlich schneller ist als PowerShell 7.4.6. Das ist jetzt auch schneller als die Verwendung der List<T>.Add(T)-Methode.

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