Udostępnij za pomocą


Co nowego w programie PowerShell 7.5

Program PowerShell 7.5.4 zawiera następujące funkcje, aktualizacje i zmiany powodujące niezgodność. Program PowerShell 7.5.4 jest oparty na wersji .NET 9.0.306.

Aby uzyskać pełną listę zmian, zobacz CHANGELOG w repozytorium GitHub. Aby uzyskać więcej informacji na temat platformy .NET 9, zobacz Co nowego na platformie .NET 9.

Zmiany powodujące niezgodność

  • Napraw -OlderThan i -NewerThan parametry dla Test-Path, kiedy używa się PathType oraz zakresu dat (#20942). Dzięki @ArmaanMcleod!)
    • Poprzednio -OlderThan było ignorowane, jeśli określono jednocześnie.
  • Zmień New-FileCatalog -CatalogVersion wartość domyślną na 2 (#20428) (Dziękujemy)@ThomasNieto!)
  • Blokuj uzyskiwanie pomocy z lokalizacji sieciowych w ograniczonych sesjach zdalnych (#20593)
  • Instalator Windows zapamiętuje teraz używane opcje instalacji i używa ich do inicjowania opcji następnej instalacji (#20420) (Dzięki@reduckted!)
  • ConvertTo-Jsonteraz serializuje BigInteger jako liczbę (#21000) (dzięki@jborean93!)

Zaktualizowane moduły

Program PowerShell 7.5.4 zawiera następujące zaktualizowane moduły:

  • Microsoft.PowerShell.PSResourceGet v1.1.1
  • PSReadLine w wersji 2.3.6

Ulepszenia uzupełniania kart

Serdeczne podziękowania dla @ArmaanMcleod i innych osób za całą ich pracę nad ulepszeniem automatycznego uzupełniania zakładek.

  • Zastosuj wnioskowanie typu, gdy nie można uzyskać dostępu do wartości klucza w tablicy skrótów z bezpiecznego wyrażenia (#21184) (Dzięki @MartinGC94!)
  • Napraw regresję podczas wnioskowania typu dla $_ (#21223) (Dzięki @MartinGC94!)
  • Rozwiń ~ do $HOME w systemie Windows z uzupełnianiem za pomocą tabulatora (#21529)
  • Nie uzupełniaj podczas deklarowania nazwy parametru i składowej klasy (#21182) (Dzięki @MartinGC94!)
  • Zapobiegaj domyślnemu uzupełnianiu nazw plików przy użyciu klawisza tabulatora podczas uzupełniania nazw typów (#20084) (Dziękujemy@MartinGC94))
  • Dodanie uzupełniacza argumentów do -Version dla Set-StrictMode (#20554) (Dziękujemy @ArmaanMcleod!))
  • Dodaj -Verb narzędzie do uzupełniania argumentów dla Get-Verb/ Get-Command i zrefaktoryzuj Get-Verb (#20286) (dzięki @ArmaanMcleod))
  • Dodaj -Verb uzupełniacz argumentu dla Start-Process (#20415) (Dzięki @ArmaanMcleod))
  • Dodaj -Scope moduł uzupełniania argumentów dla poleceń *-Variable, *-Alias i *-PSDrive (#20451) (Dziękujemy @ArmaanMcleod))
  • Dodaj -Module uzupełnianie dla poleceń Save-Help/Update-Help (#20678) (Dziękujemy @ArmaanMcleod))

Nowe polecenia cmdlet

  • Dodaj ConvertTo-CliXml i ConvertFrom-CliXml polecenia cmdlet (#21063) (Dzięki @ArmaanMcleod!))

Ulepszenia poleceń cmdlet sieci Web

  • Poprawka umożliwiająca współdziałanie -PassThru i -Outfile (#24086)
  • Dodaj właściwość OutFile w WebResponseObject (#24047)
  • Pokaż nazwę pliku w Invoke-WebRequest -OutFile -Verbose (#24041)
  • Napraw WebCmdlets, gdy -Body jest określony, ale ContentType nie jest (#23952) (Dziękujemy @CarloToso!))
  • Popraw Invoke-WebRequest, aby raportować poprawny rozmiar, gdy -Resume jest określony (#20207) (Dzięki @LNKLEO!))
  • Naprawianie poleceń cmdlet sieci Web w celu umożliwienia poprawnej WinForm pracy aplikacji (#20606)

Inne ulepszenia poleceń cmdlet

  • Popraw Out-GridView, zastępując przestarzałe BinaryFormatter implementacją niestandardową (#25559)
  • Włącz -NoRestart do pracy z Register-PSSessionConfiguration (#23891)
  • Dodaj opcje IgnoreComments i AllowTrailingCommas do polecenia cmdlet Test-Json (#23817) (dzięki @ArmaanMcleod!))
  • Polecenie Get-Help może zgłaszać parametry z atrybutem ValueFromRemainingArguments jako możliwe do przesyłania w potoku (#23871)
  • Zmień typ LineNumber na ulong w Select-String (#24075) (Dziękujemy@Snowman-25!))
  • Get-Process: Usuń wymaganie administratora dla -IncludeUserName (#21302) (Dziękujemy@jborean93!)
  • Popraw Test-Path -IsValid, aby sprawdzić nieprawidłowe znaki ścieżki i nazwy pliku (#21358)
  • Dodaj RecommendedAction do ConciseView raportowania błędów (#20826) dzięki @JustinGrote!)
  • Dodano pasek postępu dla Remove-Item polecenia cmdlet (#20778) (Dziękujemy)@ArmaanMcleod!)
  • Poprawka Test-Connection spowodowana zmianami platformy .NET 8 (#20369)
  • Napraw Get-Service niekończący się komunikat o błędzie, aby dodać kategorię (#20276)
  • Dodaj parametr -Empty i -InputObject do New-Guid (#20014) (Dzięki @CarloToso!))
  • Dodaj alias r do parametru -RecurseGet-ChildItem dla polecenia (#20100) (Dzięki@kilasuit!)
  • Dodaj LP do LiteralPath aliasów dla funkcji, które nadal nie mają tych aliasów (#20820)
  • Dodaj niejawną lokalizację rezerwową do Import-LocalizedData (#19896) (Dzięki @chrisdent-de!))
  • Dodaj Aliases do właściwości, które są wyświetlane podczas formatowania treści pomocy dotyczącej parametru zwróconego przez Get-Help (#20994)
  • Dodaj HelpUri do Remove-Service (#20476)
  • Napraw awarię uzupełniania dla dostawcy SCCM (#20815, #20919, #20915) (Dziękujemy @MartinGC94!))
  • Naprawa regresji w Get-Content, gdy -Tail 0 i -Wait są używane razem (#20734) dzięki @CarloToso!)
  • Popraw Start-Process -PassThru, aby upewnić się, że właściwość ExitCode jest dostępna dla zwróconego obiektu Process (#20749) (Dzięki @CodeCyclone!))
  • Poprawka Group-Object służąca do używania bieżącej kultury dla danych wyjściowych (#20608)
  • Napraw Group-Object dane wyjściowe przy użyciu ciągów interpolowanych (#20745) (Dzięki @mawosoft!))
  • Napraw renderowanie DisplayRoot dla sieci PSDrive (#20793)
  • Popraw Copy-Item postęp tak, aby pokazywał zakończenie tylko po skopiowaniu wszystkich plików (#20517)
  • Napraw regresję ukończenia ścieżki UNC (#20419) (dzięki@MartinGC94!)
  • Zgłoś błąd, jeśli jest przekazywany nieprawidłowy -ExecutionPolicy do pwsh (#20460)
  • Dodawanie modułów WinGetCommandNotFound i CompletionPredictor w celu śledzenia użycia (#21040)
  • Dodaj parametr DateKind do (ConvertFrom-Json#20925) (Dziękujemy)@jborean93!)
  • Dodawanie informacji o katalogu do parametru OutputType dla nowego elementu (#21126) (dziękujemy)@MartinGC94!)
  • Napraw Get-Error serializację wartości tablicy (#21085) (Dzięki @jborean93!)
  • Poprawka Test-ModuleManifest umożliwiająca używanie ścieżki UNC (#24115)
  • Poprawka Get-TypeData do natychmiastowego zapisywania do potoku zamiast zbierania najpierw danych (#24236) (dzięki @MartinGC94)
  • Dodaj -Force parametr do poleceń cmdlet Resolve-Path i Convert-Path w celu obsługi ukrytych plików z użyciem symboli wieloznacznych #20981 (dzięki @ArmaanMcleod!)
  • Ustawianie standardowych dojść jawnie podczas uruchamiania procesu za pomocą -NoNewWindow programu (#25324)
  • Umożliwia dostęp do dziedziczonej składowej wystąpienia wewnętrznego chronionego w zakresie klas. (#25547) (Dzięki @mawosoft!)
  • Usuń niedoprecyzowaną starą sugestię i napraw sugestię nazwy pliku skryptu lokalnego (#25330)
  • Naprawiono metodę PSMethodInvocationConstraints.GetHashCode (#25306) (Dzięki @crazyjncsu!)

Ulepszenia silnika

  • Przenieś rejestrowanie wywołań metod platformy .NET po zakończeniu wymaganej konwersji typu dla argumentów metody (#25357)
  • Powrót do funkcji AppLocker po WldpCanExecuteFile (#25305)
  • Jawnie uruchom i zatrzymaj kolor błędu ANSI (#24065) (Dziękujemy@JustinGrote!))
  • Popraw definicję przeciążenia metod generycznych .NET (#21326) (Dzięki)
  • Zoptymalizuj operację += dla kolekcji, gdy jest to tablica obiektów (#23901) (Dzięki@jborean93!)
  • Dodawanie telemetrii w celu sprawdzenia określonych tagów podczas importowania modułu (#20371)
  • Dodaj PSAdapter i ConsoleGuiTools do listy dozwolonych danych telemetrycznych modułu ładowania (#20641)
  • Dodawanie modułu WinGet w celu śledzenia użycia (#21040)
  • Upewnij się, że nazwa pliku nie ma wartości null podczas rejestrowania zdarzeń WDAC ETW (#20910) (Dzięki@jborean93!)
  • Naprawiono cztery regresje wprowadzone przez funkcję rejestrowania WDAC (#20913)
  • Pozostaw niezastawioną obsługę danych wejściowych, wyjściowych i błędów, gdy nie są przekierowywane (#20853)
  • Napraw niejawne polecenia cmdlet zdalnego serwera proxy, aby działały na typowych parametrach (#20367)
  • Dołącz wersję modułu w komunikatach o błędach, gdy moduł nie zostanie znaleziony (#20144) (dziękujemy)@ArmaanMcleod!)
  • Popraw unixmode do obsługi setuid i sticky, kiedy plik nie jest wykonywalny (#20366)
  • Poprawka przy użyciu zestawu do używania metody Path.Combine podczas konstruowania ścieżek zestawów (#21169)
  • Zweryfikuj wartość przestrzeni nazw podczas kontroli semantycznych, aby zapobiec deklarowaniu nieprawidłowych przestrzeni nazw (#21162)
  • Obsługa narzędzia globalnego specjalnie podczas dołączania $PSHOME do PATH (#24228)

Funkcje eksperymentalne

Następujące funkcje eksperymentalne zostały przekonwertowane na funkcje podstawowe w programie PowerShell 7.5-rc.1:

W programie PowerShell 7.5-rc.1 znajdują się następujące funkcje eksperymentalne:

Ulepszenia wydajności

Program PowerShell 7.5-rc.1 zawierał żądanie ściągnięcia nr 23901 z @jborean93, który poprawia wydajność operacji += dla tablicy obiektów.

Poniższy przykład mierzy wydajność w przypadku różnych metod dodawania elementów do tablicy.

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

Po uruchomieniu skryptu w programie PowerShell 7.4.6 zobaczysz, że użycie operatora += jest najwolniejszą metodą.

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

Po uruchomieniu skryptu w programie PowerShell 7.5-rc.1 zobaczysz, że użycie operatora += jest znacznie szybsze niż program PowerShell 7.4.6. Teraz jest ona również szybsza niż użycie 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