Bagikan melalui


Apa yang Baru di PowerShell 7.5

PowerShell 7.5.4 menyertakan fitur-fitur, pembaruan, dan perubahan besar berikut ini. PowerShell 7.5.4 dibangun pada rilis .NET 9.0.306.

Untuk daftar lengkap perubahan, lihat CHANGELOG di repositori GitHub. Untuk informasi selengkapnya tentang .NET 9, lihat Apa yang baru di .NET 9.

Memecahkan Perubahan

  • Perbaikan parameter -OlderThan dan -NewerThan untuk Test-Path saat menggunakan PathType dan rentang tanggal (#20942) (Terima kasih @ArmaanMcleod!)
    • Sebelumnya -OlderThan akan diabaikan jika ditentukan bersama-sama
  • Ubah New-FileCatalog -CatalogVersion default ke 2 (#20428) (Terima kasih @ThomasNieto!)
  • Mencegah bantuan dari lokasi jaringan dalam sesi jarak jauh terbatas (#20593)
  • Alat penginstal Windows sekarang mengingat opsi penginstalan yang digunakan dan menggunakannya untuk menginisialisasi opsi untuk penginstalan berikutnya (#20420) (Terima kasih @reduckted!)
  • ConvertTo-Json sekarang diserialisasikan BigInteger sebagai angka (#21000) (Terima kasih @jborean93!)

Modul yang diperbarui

PowerShell 7.5.4 menyertakan modul yang diperbarui berikut:

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

Peningkatan fitur penyelesaian tab

Terima kasih banyak kepada @ArmaanMcleod dan yang lainnya atas semua upaya mereka untuk meningkatkan penyelesaian tab.

  • Kembali ke inferensi jenis ketika nilai kunci yang dapat di-hash tidak dapat diambil dari ekspresi aman (#21184) (Terima kasih @MartinGC94!)
  • Perbaiki regresi saat melakukan inferensi jenis untuk $_ (#21223) (Terima kasih @MartinGC94!)
  • Perluas ~ ke $HOME pada Windows dengan penyelesaian tab (#21529)
  • Jangan selesai saat mendeklarasikan nama parameter dan anggota kelas (#21182) (Terima kasih @MartinGC94!)
  • Mencegah fallback ke penyelesaian file saat tab menyelesaikan nama jenis (#20084) (Terima kasih @MartinGC94)
  • Tambahkan penyelesaian argumen ke -Version untuk Set-StrictMode (#20554) (Terima kasih @ArmaanMcleod!)
  • Tambahkan -Verb pelengkap argumen untuk Get-Verb/ Get-Command dan perombakan Get-Verb (#20286) (Terima kasih @ArmaanMcleod))
  • Tambahkan -Verb pelengkap argumen untuk Start-Process (#20415) (Terima kasih @ArmaanMcleod)
  • Tambahkan -Scope pengisi argumen untuk *-Variable, *-Alias & *-PSDrive perintah (#20451) (Terima kasih @ArmaanMcleod)
  • Tambahkan penyelesaian -Module untuk perintah Save-Help/Update-Help (#20678) (Terima kasih @ArmaanMcleod))

Cmdlet baru

  • Tambahkan ConvertTo-CliXml dan ConvertFrom-CliXml cmdlet (#21063) (Terima kasih @ArmaanMcleod!)

Peningkatan terhadap cmdlet web

  • Perbaikan untuk mengizinkan -PassThru dan -Outfile bekerja sama (#24086)
  • Tambahkan OutFile properti di WebResponseObject (#24047)
  • Tampilkan nama file dalam Invoke-WebRequest -OutFile -Verbose (#24041)
  • Perbaiki WebCmdlet ketika -Body ditentukan tetapi ContentType tidak (#23952) (Terima kasih @CarloToso!)
  • Memperbaiki Invoke-WebRequest untuk melaporkan ukuran yang benar saat -Resume ditentukan (#20207) (Terima kasih @LNKLEO!)
  • Perbaiki Cmdlet Web untuk memungkinkan WinForm aplikasi berfungsi dengan benar (#20606)

Peningkatan lainnya pada cmdlet

  • Perbaiki Out-GridView dengan mengganti penggunaan usang BinaryFormatter dengan implementasi kustom (#25559)
  • Aktifkan -NoRestart untuk bekerja dengan Register-PSSessionConfiguration (#23891)
  • Tambahkan IgnoreComments dan AllowTrailingCommas opsi ke Test-Json cmdlet (#23817) (Terima kasih @ArmaanMcleod!)
  • Get-Help dapat melaporkan parameter dengan ValueFromRemainingArguments atribut sebagai pipeline-able (#23871)
  • Ubah jenis menjadi LineNumberulong di Select-String (#24075) (Terima kasih @Snowman-25!)
  • Get-Process: Hapus persyaratan admin untuk -IncludeUserName (#21302) (Terima kasih @jborean93!)
  • Perbaiki Test-Path -IsValid untuk memeriksa jalur dan karakter nama file yang tidak valid (#21358)
  • Tambahkan RecommendedAction ke ConciseView pelaporan kesalahan (#20826) (Terima kasih @JustinGrote!)
  • Menambahkan bilah kemajuan untuk Remove-Item cmdlet (#20778) (Terima kasih @ArmaanMcleod!)
  • Perbaikan Test-Connection karena perubahan .NET 8 (#20369)
  • Memperbaiki Get-Service pesan kesalahan berkelanjutan untuk menyertakan kategori (#20276)
  • Tambahkan -Empty parameter dan -InputObject ke New-Guid (#20014) (Terima kasih @CarloToso!)
  • Tambahkan alias r ke parameter -Recurse untuk Get-ChildItem perintah (#20100) (Terima kasih @kilasuit!)
  • Tambahkan LP ke LiteralPath alias untuk fungsi yang masih kehilangannya (#20820)
  • Tambahkan fallback pelokalan implisit ke Import-LocalizedData (#19896) (Terima kasih @chrisdent-de!)
  • Tambahkan Aliases ke properti yang muncul saat memformat konten bantuan parameter yang dikembalikan oleh Get-Help (#20994)
  • Tambahkan HelpUri ke Remove-Service (#20476)
  • Memperbaiki kerusakan saat proses penyelesaian untuk penyedia SCCM (#20815, #20919, #20915) (Terima kasih @MartinGC94!)
  • Memperbaiki regresi saat Get-Content-Tail 0 dan -Wait digunakan bersama-sama (#20734) (Terima kasih @CarloToso!)
  • Perbaikan Start-Process -PassThru untuk memastikan ExitCode properti dapat diakses untuk objek yang dikembalikan Process (#20749) (Terima kasih @CodeCyclone!)
  • Perbaiki Group-Object agar menggunakan budaya saat ini untuk outputnya (#20608)
  • Memperbaiki Group-Object output menggunakan string terinterpolasi (#20745) (Terima kasih @mawosoft!)
  • Memperbaiki penyajian DisplayRoot untuk jaringan PSDrive (#20793)
  • Perbaiki status kemajuan Copy-Item agar hanya ditampilkan sebagai selesai ketika semua file disalin (#20517)
  • Memperbaiki regresi penyelesaian jalur UNC (#20419) (Terima kasih @MartinGC94!)
  • Melaporkan kesalahan jika -ExecutionPolicy yang tidak valid diteruskan ke pwsh (#20460)
  • Tambahkan modul WinGetCommandNotFound dan CompletionPredictor untuk melacak penggunaan (#21040)
  • Tambahkan parameter DateKind ke ConvertFrom-Json (#20925) (Terima kasih @jborean93!)
  • Tambahkan DirectoryInfo ke OutputType for New-Item (#21126) (Terima kasih @MartinGC94!)
  • Memperbaiki Get-Error serialisasi nilai array (#21085) (Terima kasih @jborean93!)
  • Perbaikan Test-ModuleManifest sehingga dapat menggunakan jalur UNC (#24115)
  • Perbaiki Get-TypeData untuk segera menulis ke alur alih-alih mengumpulkan data terlebih dahulu (#24236) (Terima kasih @MartinGC94)
  • Tambahkan -Force parameter ke Resolve-Path dan Convert-Path cmdlet untuk mendukung file tersembunyi wildcard #20981 (Terima kasih @ArmaanMcleod!)
  • Atur pegangan standar secara eksplisit saat memulai proses dengan -NoNewWindow (#25324)
  • Jadikan anggota instans internal terlindungi yang diwarisi dapat diakses dalam lingkup kelas. (#25547) (Terima kasih @mawosoft!)
  • Hapus saran fuzzy lama dan perbaiki saran nama file skrip lokal (#25330)
  • Memperbaiki PSMethodInvocationConstraints.GetHashCode metode (#25306) (Terima kasih @crazyjncsu!)

Peningkatan mesin

  • Pindahkan pencatatan pemanggilan metode .NET ke setelah konversi jenis yang diperlukan dilakukan untuk argumen metode (#25357)
  • Kembali ke AppLocker setelah WldpCanExecuteFile (#25305)
  • Secara eksplisit memulai dan menghentikan Warna Kesalahan ANSI (#24065) (Terima kasih @JustinGrote!)
  • Meningkatkan definisi kelebihan beban .NET dari metode generik (#21326) (Terima kasih @jborean93!)
  • += Optimalkan operasi untuk koleksi saat merupakan array objek (#23901) (Terima kasih@jborean93!)
  • Menambahkan telemetri untuk memeriksa tag tertentu saat mengimpor modul (#20371)
  • Tambahkan PSAdapter dan ConsoleGuiTools ke daftar izin telemetri beban modul (#20641)
  • Menambahkan modul WinGet untuk melacak penggunaan (#21040)
  • Pastikan nama file tidak null saat mencatat peristiwa WDAC ETW (#20910) (Terima kasih @jborean93!)
  • Memperbaiki empat regresi yang diperkenalkan oleh fitur pengelogan WDAC (#20913)
  • Biarkan input, output, dan kesalahan menangani unset saat tidak dialihkan (#20853)
  • Perbaiki cmdlet proksi jarak jauh implisit untuk bertindak pada parameter umum (#20367)
  • Sertakan versi modul dalam pesan kesalahan saat modul tidak ditemukan (#20144) (Terima kasih @ArmaanMcleod!)
  • Memperbaiki unixmode untuk menangani setuid dan sticky ketika file bukan file yang dapat dieksekusi (#20366)
  • Perbaiki dengan menggunakan Path.Combine saat menyusun jalur rakitan (#21169)
  • Validasi nilai untuk menggunakan namespace selama pemeriksaan semantik untuk mencegah mendeklarasikan namespace tidak valid (#21162)
  • Tangani alat global secara khusus saat menambahkan $PSHOME di awal PATH (#24228)

Fitur eksperimental

Fitur eksperimental berikut dikonversi ke fitur mainstream di PowerShell 7.5-rc.1:

Fitur eksperimental berikut disertakan dalam PowerShell 7.5-rc.1:

Peningkatan performa

PowerShell 7.5-rc.1 menyertakan PR#23901 dari @jborean93 yang meningkatkan kinerja operasi += untuk array objek.

Contoh berikut mengukur performa untuk berbagai metode penambahan elemen ke 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
}

Saat Anda menjalankan skrip di PowerShell 7.4.6, Anda melihat bahwa menggunakan operator += adalah metode paling lambat.

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

Saat Anda menjalankan skrip di PowerShell 7.5-rc.1, Anda melihat bahwa menggunakan operator += jauh lebih cepat daripada PowerShell 7.4.6. Sekarang, ini juga lebih cepat daripada menggunakan metode 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