Dela via


Nyheter i PowerShell 7.5

PowerShell 7.5.0 innehåller följande funktioner, uppdateringar och icke-bakåtkompatibla ändringar. PowerShell 7.5 bygger på .NET 9.0.1 GA-versionen.

En fullständig lista över ändringar finns i CHANGELOG på GitHub-lagringsplatsen. Mer information om .NET 9 finns i [Nyheter i .NET 9][07].

Icke-bakåtkompatibla ändringar

  • Korrigering -OlderThan och -NewerThan parametrar för Test-Path när du använder PathType och datumintervall (#20942) (Tack @ArmaanMcleod!)
    • Tidigare -OlderThan skulle ignoreras om det anges tillsammans
  • Ändra New-FileCatalog -CatalogVersion standardvärdet till 2 (#20428) (tack @ThomasNieto!)
  • Blockera att få hjälp från nätverksplatser i begränsade fjärrkommunikationssessioner (#20593)
  • Windows-installationsprogrammet kommer nu ihåg de installationsalternativ som används och använder dem för att initiera alternativ för nästa installation (#20420) (Tack @reduckted!)
  • ConvertTo-Json serialiserar BigInteger nu som ett tal (#21000) (tack @jborean93!)
  • .NET 9 tog bort BinaryFormatter-implementeringen som orsakade en regression i cmdleten Out-GridView. Sökfunktionen i Out-GridView fungerar inte i PowerShell 7.5. Det här problemet spåras i Issue #24749.

Moduler har uppdaterats

PowerShell 7.5.0 innehåller följande uppdaterade moduler:

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

Förbättringar av flikens slutförande

Stort tack till @ArmaanMcleod och andra för allt deras arbete för att förbättra fliken slutförande.

  • Återgå till typinferens när hashtabellnyckelvärde inte kan hämtas från ett säkert uttryck (#21184) (Tack @MartinGC94!)
  • Åtgärda regressionen när du gör typinferens för $_ (#21223) (tack @MartinGC94!)
  • Expandera ~ till $home i Windows med tabbavslut (#21529)
  • Slutför inte när du deklarerar parameternamn och klassmedlem (#21182) (Tack @MartinGC94!)
  • Förhindra återställning till filkomplettering när fliken slutför typnamn (#20084) (tack @MartinGC94)
  • Lägg till argument completer till -Version för Set-StrictMode (#20554) (Tack @ArmaanMcleod!)
  • Lägg till -Verb argument completer för Get-Verb/ Get-Commandoch refaktor Get-Verb (#20286) (Tack@ArmaanMcleod)
  • Lägg till -Verb argument completer för Start-Process (#20415) (Tack @ArmaanMcleod)
  • Lägg till -Scope argument completer för *-Variable, *-Alias & *-PSDrive kommandon (#20451) (Tack @ArmaanMcleod)
  • Lägg till -Module slutförande för Save-Help/Update-Helpkommandon (#20678) (tack@ArmaanMcleod)

Nya cmdletar

  • Lägg till ConvertTo-CliXml och ConvertFrom-CliXml cmdletar (#21063) (tack @ArmaanMcleod!)

Förbättringar av webb-cmdletar

  • Korrigering för att tillåta att -PassThru och -Outfile fungerar tillsammans (#24086)
  • Lägg till egenskapen OutFile i WebResponseObject (#24047)
  • Visa filnamn i Invoke-WebRequest -OutFile -Verbose (#24041)
  • Åtgärda WebCmdlets när -Body har angetts men ContentType är inte (#23952) (Tack @CarloToso!)
  • Korrigering Invoke-WebRequest för att rapportera rätt storlek när -Resume har angetts (#20207) (Tack @LNKLEO!)
  • Åtgärda webb-cmdletar så att appar kan WinForm fungera korrekt (#20606)

Andra cmdlet-förbättringar

  • Aktivera -NoRestart för att arbeta med Register-PSSessionConfiguration (#23891)
  • Lägg till IgnoreComments och alternativ för AllowTrailingCommas cmdlet (Test-Json) (Tack@ArmaanMcleod!)
  • Get-Help kan rapportera parametrar med ValueFromRemainingArguments attribut som pipeline-able (#23871)
  • Ändra typ av LineNumber till ulong i Select-String (#24075) (Tack @Snowman-25!)
  • Get-Process: Ta bort administratörskrav för -IncludeUserName (#21302) (tack @jborean93!)
  • Korrigering Test-Path -IsValid för att söka efter ogiltiga sökvägar och filnamnstecken (#21358)
  • Lägg till RecommendedActionConciseView i felrapportering (#20826) (tack @JustinGrote!)
  • Förloppsindikatorn har lagts till för Remove-Item cmdlet (#20778) (tack @ArmaanMcleod!)
  • Korrigering Test-Connection på grund av .NET 8-ändringar (#20369)
  • Åtgärda Get-Service icke-avslutande felmeddelande för att inkludera kategori (#20276)
  • Lägg till -Empty och -InputObject parametrar i New-Guid (#20014) (tack @CarloToso!)
  • Lägg till aliaset r i parametern -RecurseGet-ChildItem för kommandot (#20100) (Tack @kilasuit!)
  • Lägg till LPLiteralPath i alias för funktioner som fortfarande saknar det (#20820)
  • Lägg till implicit lokaliseringsåterställning till Import-LocalizedData (#19896) (Tack @chrisdent-de!)
  • Lägg till Aliases i egenskaperna som visas när du formaterar hjälpinnehållet för parametern som returneras av Get-Help (#20994)
  • Lägg till HelpUri i Remove-Service (#20476)
  • Åtgärda slutförandekrasch för SCCM-providern (#20815, #20919, #20915) (Tack @MartinGC94!)
  • Åtgärda regression i Get-Content när -Tail 0 och -Wait används tillsammans (#20734) (tack @CarloToso!)
  • Korrigering Start-Process -PassThru för att kontrollera ExitCode att egenskapen är tillgänglig för det returnerade Process objektet (#20749) (tack @CodeCyclone!)
  • Korrigering Group-Object för att använda aktuell kultur för dess utdata (#20608)
  • Åtgärda Group-Object utdata med hjälp av interpolerade strängar (#20745) (tack @mawosoft!)
  • Åtgärda rendering av DisplayRoot för nätverk PSDrive (#20793)
  • Åtgärda Copy-Item förloppet för att endast visa slutförda när alla filer kopieras (#20517)
  • Åtgärda regression av UNC-sökvägens slutförande (#20419) (tack @MartinGC94!)
  • Rapportfel om ogiltigt -ExecutionPolicy skickas till pwsh (#20460)
  • Lägg till WinGetCommandNotFound - och CompletionPredictor-moduler för att spåra användningen (#21040)
  • Lägg till DateKind-parametern i ConvertFrom-Json (#20925) (tack @jborean93!)
  • Lägg till DirectoryInfo i OutputType för nytt objekt (#21126) (tack @MartinGC94!)
  • Åtgärda Get-Error serialisering av matrisvärden (#21085) (tack @jborean93!)
  • Åtgärda Test-ModuleManifest så att den kan använda en UNC-sökväg (#24115)
  • Korrigering Get-TypeData för att skriva till pipelinen omedelbart i stället för att samla in data först (#24236) (Tack @MartinGC94)
  • Lägg till -Force parametern i Resolve-Path och Convert-Path cmdletar för att stödja dolda jokerteckenfiler #20981 (tack @ArmaanMcleod!)

Motorförbättringar

  • Starta och stoppa ansi-felfärg (#24065) (tack @JustinGrote!)
  • Förbättra .NET-överlagringsdefinitionen för generiska metoder (#21326) (tack @jborean93!)
  • Optimera åtgärden += för en samling när det är en objektmatris (#23901) (Tack @jborean93!)
  • Lägg till telemetri för att söka efter specifika taggar när du importerar en modul (#20371)
  • Lägg till PSAdapter och ConsoleGuiTools i modulens lista över tillåtna inläsningar (#20641)
  • Lägg till WinGet-modul för att spåra användning (#21040)
  • Kontrollera att filnamnet inte är null när WDAC ETW-händelser loggas (#20910) (tack @jborean93!)
  • Åtgärda fyra regressioner som introducerades av WDAC-loggningsfunktionen (#20913)
  • Lämna indata, utdata och felhandtag oeterade när de inte omdirigeras (#20853)
  • Åtgärda implicita cmdletar för fjärrkommunikationsproxy för att agera på vanliga parametrar (#20367)
  • Inkludera modulversionen i felmeddelanden när modulen inte hittas (#20144) (tack @ArmaanMcleod!)
  • Korrigering unixmode för att hantera setuid och sticky när filen inte är körbar (#20366)
  • Åtgärda användningen av sammansättningen för att använda Path.Combine när du skapar sammansättningssökvägar (#21169)
  • Verifiera värdet för att använda namnområdet under semantiska kontroller för att förhindra att ogiltiga namnområden deklareras (#21162)
  • Hantera globala verktyg särskilt när du väntar på $PSHome PATH (#24228)

Experimentella funktioner

Följande experimentella funktioner konverterades till vanliga funktioner i PowerShell 7.5-rc.1:

Följande experimentella funktioner ingår i PowerShell 7.5-rc.1:

Prestandaförbättringar

PowerShell 7.5-rc.1 inkluderade PR#23901 från @jborean93 som förbättrar prestandan för den += åtgärden för en matris med objekt.

I följande exempel mäts prestanda för olika metoder för att lägga till element i en matris.

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

När du kör skriptet i PowerShell 7.4.6 ser du att det är den långsammaste metoden att använda operatorn +=.

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

När du kör skriptet i PowerShell 7.5-rc.1 ser du att det går mycket snabbare att använda +=-operatorn än PowerShell 7.4.6. Nu är det också snabbare än att använda metoden 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

[07]: /dotnet/core/whats-new/dotnet-9/overview)