Sdílet prostřednictvím


Novinky v PowerShellu 7.5

PowerShell 7.5.0 obsahuje následující funkce, aktualizace a zásadní změny. PowerShell 7.5 je založený na verzi GA .NET 9.0.1.

Úplný seznam změn najdete v protokolu CHANGELOG v úložišti GitHub. Další informace o rozhraní .NET 9 najdete v tématu [Co je nového v .NET 9][07].

Zásadní změny

  • Oprava -OlderThan a -NewerThan parametry pro Test-Path použití PathType a rozsah dat (#20942) (Děkujeme@ArmaanMcleod!)
    • -OlderThan Dříve by bylo ignorováno, pokud je zadáno společně.
  • Změna New-FileCatalog -CatalogVersion výchozího nastavení na 2 (#20428) (Děkujeme@ThomasNieto!)
  • Blokování nápovědy k síťovým umístěním v relacích omezené komunikace (#20593)
  • Instalační služba systému Windows si teď pamatuje použité možnosti instalace a používá je k inicializaci možností pro další instalaci (#20420) (děkujeme@reduckted!)
  • ConvertTo-Jsonnyní serializuje BigInteger jako číslo (#21000) (Díky@jborean93!)
  • Rozhraní .NET 9 odebralo implementaci BinaryFormatter, což způsobilo regresi v příkazu cmdlet Out-GridView. Funkce vyhledávání Out-GridView nefunguje v PowerShellu 7.5. Tento problém se sleduje v Issue #24749.

Aktualizované moduly

PowerShell 7.5.0 obsahuje následující aktualizované moduly:

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

Vylepšení dokončování tabulátoru

Mnoho díky @ArmaanMcleod a ostatním za veškerou práci, aby se zlepšilo dokončování tabulátoru.

  • Návrat k odvození typu, pokud nelze hodnotu hashtable klíč-hodnota načíst z bezpečného výrazu (#21184) (Děkujeme@MartinGC94!)
  • Oprava regrese při odvozování typu pro $_ (#21223) (Díky@MartinGC94!)
  • Rozbalení ~ ve Windows s dokončováním karet ($home)
  • Nedokončujte při deklarování názvu parametru a člena třídy (#21182) (Děkujeme@MartinGC94!)
  • Zabránění dokončení náhradního souboru při dokončování názvů typů tabulátoru (#20084) (Díky@MartinGC94)
  • Přidání dokončování argumentů pro -VersionSet-StrictMode (#20554) (Děkujeme@ArmaanMcleod!)
  • Přidání -Verb dokončování argumentů pro Get-Verb/ Get-Command a refaktoring Get-Verb (#20286) (Děkujeme@ArmaanMcleod)
  • Přidání -Verb dokončování argumentů pro Start-Process (#20415) (Děkujeme@ArmaanMcleod)
  • Přidání -Scope dokončování argumentů pro *-Variablepříkazy *-Alias a *-PSDrive příkazy (#20451) (Děkujeme@ArmaanMcleod)
  • Přidání -Module dokončování pro Save-Help/Update-Help příkazy (#20678) (Děkujeme@ArmaanMcleod)

Nové rutiny

  • Přidání ConvertTo-CliXml a ConvertFrom-CliXml rutiny (#21063) (děkujeme@ArmaanMcleod!)

Vylepšení webových rutin

  • Oprava umožňující spolupráci -PassThru a -Outfile (#24086)
  • Přidat vlastnost OutFile v WebResponseObject (#24047)
  • Zobrazit název souboru v Invoke-WebRequest -OutFile -Verbose (#24041)
  • Oprava webCmdlets při -Body zadání, ale ContentType není (#23952) (Díky@CarloToso!)
  • Oprava Invoke-WebRequest nahlášení správné velikosti při -Resume zadání (#20207) (Díky@LNKLEO!)
  • Oprava webových rutin, aby WinForm aplikace fungovaly správně (#20606)

Další vylepšení rutin

  • Povolení -NoRestart práce s Register-PSSessionConfiguration aplikací (#23891)
  • Přidání IgnoreComments a AllowTrailingCommas možnosti rutiny Test-Json (#23817) (Děkujeme@ArmaanMcleod!)
  • Get-Help může hlásit parametry s atributem ValueFromRemainingArguments jako kanálem (#23871)
  • Změnit typ LineNumber na ulong in Select-String (#24075) (Děkujeme@Snowman-25!)
  • Get-Process: Odebrání požadavku správce pro -IncludeUserName (#21302) (Děkujeme@jborean93!)
  • Oprava Test-Path -IsValid kontroly neplatných znaků cesty a názvu souboru (#21358)
  • Přidání RecommendedAction do ConciseView hlášení chyb (#20826) (Děkujeme@JustinGrote!)
  • Přidání indikátoru průběhu pro Remove-Item rutinu (#20778) (Děkujeme@ArmaanMcleod!)
  • Oprava Test-Connection kvůli změnám .NET 8 (#20369)
  • Oprava Get-Service neukončující chybové zprávy pro zahrnutí kategorie (#20276)
  • Přidání -Empty a -InputObject parametry do New-Guid aplikace (#20014) (Děkujeme@CarloToso!)
  • Přidání aliasu r k parametru -RecurseGet-ChildItem příkazu (#20100) (Děkujeme@kilasuit!)
  • Přidání LP do LiteralPath aliasů pro funkce stále chybí (#20820)
  • Přidat implicitní lokalizaci náhradním místem Import-LocalizedData (#19896) (Díky@chrisdent-de!)
  • Přidání Aliases do vlastností zobrazených při formátování obsahu nápovědy parametru vráceného uživatelem Get-Help (#20994)
  • Přidat HelpUri do Remove-Service (#20476)
  • Oprava chybového ukončení dokončení pro poskytovatele SCCM (#20815, #20919, #20915) (děkujeme @MartinGC94!)
  • Oprava regrese v Get-Content případech, kdy -Tail 0 a -Wait jsou použity společně (#20734) (Díky@CarloToso!)
  • OpravaStart-Process -PassThru, abyste měli jistotu, ExitCode že je vlastnost přístupná pro vrácený Process objekt (#20749) (Děkujeme@CodeCyclone!)
  • Oprava Group-Object použití aktuální jazykové verze pro výstup (#20608)
  • Oprava Group-Object výstupu pomocí interpolovaných řetězců (#20745) (Děkujeme@mawosoft!)
  • Oprava vykreslování DisplayRoot sítě PSDrive (#20793)
  • Oprava Copy-Item průběhu zobrazení pouze při kopírování všech souborů (#20517)
  • Oprava regrese dokončení cesty UNC (#20419) (Díky@MartinGC94!)
  • Chyba hlášení, pokud je předána neplatná -ExecutionPolicy (pwsh#20460)
  • Přidání modulů WinGetCommandNotFound a CompletionPredictor ke sledování využití (#21040)
  • Přidání parametru DateKind do ConvertFrom-Json (#20925) (Děkujeme@jborean93!)
  • Přidání directoryInfo do outputType pro new-item (#21126) (Díky@MartinGC94!)
  • Oprava Get-Error serializace hodnot pole (#21085) (Díky@jborean93!)
  • Oprava Test-ModuleManifest , aby mohl používat cestu UNC (#24115)
  • Oprava Get-TypeData okamžitého zápisu do kanálu místo shromažďování dat (#24236) (díky@MartinGC94)
  • Přidání -Force parametru do Resolve-Path a Convert-Path rutin pro podporu skrytých souborů se zástupnými znaky #20981 (Děkujeme @ArmaanMcleod!)

Vylepšení motoru

  • Explicitně spusťte a zastavte barvu chyby ANSI (#24065) (Díky@JustinGrote!)
  • Vylepšení definice přetížení .NET obecných metod (#21326) (Díky@jborean93!)
  • += Optimalizace operace pro kolekci, když se jedná o pole objektů (#23901) (děkujeme@jborean93!)
  • Přidání telemetrie pro kontrolu konkrétních značek při importu modulu (#20371)
  • Přidání PSAdapter a přidání do ConsoleGuiTools seznamu povolených telemetrických dat modulu (#20641)
  • Přidání modulu WinGet ke sledování využití (#21040)
  • Při protokolování událostí ETW WDAC (#20910) se ujistěte, že název souboru nemá hodnotu null (děkujeme)@jborean93!)
  • Oprava čtyř regresí zavedených funkcí protokolování WDAC (#20913)
  • Ponechte vstupní, výstupní a chybové popisovače bez nastavení, pokud nejsou přesměrovány (#20853)
  • Oprava implicitních rutin proxy vzdálené komunikace pro zpracování běžných parametrů (#20367)
  • Zahrnout verzi modulu do chybových zpráv, pokud modul nebyl nalezen (#20144) (Děkujeme@ArmaanMcleod!)
  • Oprava unixmode zpracování setuid a sticky v případech, kdy soubor není spustitelný soubor (#20366)
  • Oprava použití sestavení k použití Path.Combine při vytváření cest sestavení (#21169)
  • Ověřte hodnotu použití oboru názvů během sémantických kontrol, abyste zabránili deklarování neplatných oborů názvů (#21162).
  • Zpracování globálního nástroje speciálně při předřazení $PSHome na PATH (#24228)

Experimentální funkce

Následující experimentální funkce byly převedeny na hlavní funkce v PowerShellu 7.5-rc.1:

V PowerShellu 7.5-rc.1 jsou zahrnuty následující experimentální funkce:

Vylepšení výkonu

PowerShell 7.5-rc.1 obsahoval PR#23901 z @jborean93, který zlepšuje výkon operace += pro pole objektů.

Následující příklad měří výkon pro různé metody přidání prvků do pole.

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

Při spuštění skriptu v PowerShellu 7.4.6 uvidíte, že použití operátoru += je nejpomalejší metodou.

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

Při spuštění skriptu v PowerShellu 7.5-rc.1 uvidíte, že použití operátoru += je mnohem rychlejší než PowerShell 7.4.6. Teď je to také rychlejší než použití metody 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)