Поделиться через


Новые возможности PowerShell 7.5

PowerShell 7.5.4 включает следующие функции, обновления и критические изменения. PowerShell 7.5.4 основан на выпуске .NET 9.0.306.

Полный список изменений см. в CHANGELOG в репозитории GitHub. Дополнительные сведения о .NET 9 см. в статье "Новые возможности.NET 9".

Критические изменения

  • Исправьте параметры -OlderThan и -NewerThan для Test-Path при использовании PathType и диапазона дат (#20942) (Спасибо @ArmaanMcleod!))
    • Ранее было -OlderThan бы проигнорировано, если указано вместе
  • Измените New-FileCatalog -CatalogVersion значение по умолчанию на 2 (#20428) (спасибо) @ThomasNieto!)
  • Блокировать получение справки из сетевых расположений в ограниченных сеансах удаленного управления (#20593)
  • Установщик Windows теперь запоминает используемые параметры установки и использует их для инициализации параметров следующей установки (#20420) (спасибо) @reduckted!)
  • ConvertTo-Json теперь сериализуется BigInteger как число (#21000) (спасибо) @jborean93!)

Обновленные модули

PowerShell 7.5.4 включает следующие обновленные модули:

  • Microsoft.PowerShell.PSResourceGet версии 1.1.1
  • PSReadLine версии 2.3.6

Улучшения для заполнения нажатием клавиши TAB

Большое спасибо @ArmaanMcleod и другим за всю их работу по улучшению автодополнения.

  • Возврат к выводу типа, когда хэш-значение ключа невозможно извлечь из безопасного выражения (#21184) (спасибо) @MartinGC94!)
  • Исправлена регрессия при определении типа для $_ (#21223) (Спасибо) @MartinGC94!)
  • Расширение ~ до $HOME в Windows с автодополнением (#21529)
  • Не завершайте ввод имени параметра и члена класса (#21182) (спасибо) @MartinGC94!)
  • Предотвращение резервного завершения файла при завершении вкладки имен типов (#20084) (спасибо) @MartinGC94)
  • Добавление дополнителя аргумента к -Version для Set-StrictMode (#20554) (спасибо @ArmaanMcleod!))
  • Добавление -Verb дополнения аргументов для Get-Verb/ Get-Command и рефакторинг Get-Verb (#20286) (Спасибо @ArmaanMcleod))
  • Добавление -Verb полного аргумента для Start-Process (#20415) (спасибо) @ArmaanMcleod)
  • Добавьте дополнители аргументов для команд -Scope, *-Variable и *-Alias (*-PSDrive) (спасибо )
  • Добавить -Module завершение для Save-Help/Update-Help команд (#20678) (Спасибо @ArmaanMcleod)

Новые командлеты

  • Добавить ConvertTo-CliXml и ConvertFrom-CliXml командлет (#21063) (Спасибо @ArmaanMcleod!))

Улучшения веб-командлетов

  • Исправление, чтобы -PassThru и -Outfile могли работать вместе (№24086)
  • Добавление OutFile свойства в WebResponseObject (#24047)
  • Отображение имени файла в Invoke-WebRequest -OutFile -Verbose (#24041)
  • Исправление webCmdlets, когда -Body указан, но ContentType не указан (#23952) (благодаря @CarloToso!))
  • Исправить Invoke-WebRequest для правильной передачи размера, когда указано -Resume (#20207) (спасибо @LNKLEO!))
  • Исправление веб-командлетов для WinForm правильной работы приложений (#20606)

Другие улучшения командлетов

  • Исправьте Out-GridView, заменив использование устаревшего BinaryFormatter на пользовательскую реализацию (#25559)
  • Включить -NoRestart для работы с Register-PSSessionConfiguration (#23891)
  • Добавление параметров IgnoreComments и AllowTrailingCommas в командлет Test-Json (#23817) (спасибо @ArmaanMcleod!))
  • Get-Help могут сообщать параметры с атрибутом ValueFromRemainingArguments как подходящие для конвейерной обработки (#23871)
  • Измените тип LineNumber на ulong в Select-String (#24075) (Спасибо, @Snowman-25!))
  • Get-Process: удаление требования администратора для -IncludeUserName (No 21302) (спасибо) @jborean93!)
  • Исправлено Test-Path -IsValid, чтобы проверить наличие недопустимых символов пути и имени файла (#21358)
  • Добавить RecommendedAction к ConciseView в отчет об ошибках (№ 20826) (Спасибо @JustinGrote!))
  • Добавлена полоса прогресса для Remove-Item командлета (#20778) (спасибо @ArmaanMcleod!))
  • Исправление Test-Connection из-за изменений .NET 8 (#20369)
  • Исправление Get-Service сообщения об ошибке, которое не прекращается, для добавления категории (#20276)
  • Добавьте -Empty и -InputObject параметры к New-Guid (№ 20014) (спасибо @CarloToso!))
  • Добавьте псевдоним r в параметр -Recurse для Get-ChildItem команды (#20100) (спасибо) @kilasuit!)
  • Добавьте LP в LiteralPath для псевдонимов функций, которые всё ещё не имеют его (#20820)
  • Добавьте резервную Import-LocalizedData версию неявной локализации (No 19896) (спасибо) @chrisdent-de!)
  • Добавьте Aliases в свойства, отображаемые при форматировании содержимого справки параметра, возвращаемого Get-Help (#20994)
  • Добавление HelpUri в Remove-Service (#20476)
  • Исправлена ошибка завершения для поставщика SCCM (#20815, #20919, #20915) (спасибо) @MartinGC94!)
  • Исправлена регрессия при совместном использовании Get-Content, -Tail 0 и -Wait (#20734) (спасибо @CarloToso!))
  • Исправьте Start-Process -PassThru, чтобы убедиться, что ExitCode свойство доступно для возвращаемого Process объекта (#20749). (Спасибо @CodeCyclone!))
  • Исправить Group-Object для использования текущей культуры для его вывода (#20608)
  • Исправление Group-Object выходных данных с помощью интерполированных строк (No 20745) (спасибо) @mawosoft!)
  • Исправлена отрисовка DisplayRoot для сети PSDrive (No 20793)
  • Исправить отображение хода выполнения, чтобы показывать 'Завершено' только после копирования всех файлов (Copy-Item)
  • Исправлена регрессия завершения пути UNC (No 20419) (благодарим @MartinGC94!)
  • Сообщить об ошибке, если недопустимая -ExecutionPolicy передана в pwsh (#20460)
  • Добавление модулей WinGetCommandNotFound и CompletionPredictor для отслеживания использования (#21040)
  • Добавление параметра DateKind в ConvertFrom-Json (#20925) (спасибо) @jborean93!)
  • Добавьте DirectoryInfo в OutputType для New-Item (#21126) (спасибо @MartinGC94!)
  • Исправлена Get-Error сериализация значений массива (#21085) (спасибо) @jborean93!)
  • Исправьте Test-ModuleManifest, чтобы можно было использовать UNC-путь (#24115)
  • Исправить Get-TypeData, чтобы данные записывались в конвейер немедленно, вместо предварительного сбора данных (#24236) (Спасибо @MartinGC94))
  • Добавьте -Force параметр к командлетам Resolve-Path и Convert-Path для поддержки скрытых файлов с подстановочными знаками #20981 (спасибо @ArmaanMcleod!).
  • Явное определение стандартных дескрипторов при запуске процесса с -NoNewWindow (#25324)
  • Сделайте унаследованные защищенные элементы внутреннего экземпляра доступными в области класса. (No 25547) (Спасибо @mawosoft!)
  • Удалите старое нечеткое предложение и исправьте предложение имени файла локального скрипта (#25330)
  • Метод Fix PSMethodInvocationConstraints.GetHashCode (#25306) (спасибо) @crazyjncsu!)

Улучшения подсистемы

  • Переместите логирование вызова метода .NET после завершения необходимого преобразования типов для аргументов метода (#25357)
  • Возврат к AppLocker после сбоя WldpCanExecuteFile (#25305)
  • Явно запустите и остановите цвет ошибки ANSI (#24065) (спасибо) @JustinGrote!)
  • Улучшение определения перегрузки .NET для универсальных методов (#21326) (спасибо) @jborean93!)
  • += Оптимизируйте операцию для коллекции, когда это массив объектов (#23901) (спасибо)@jborean93!)
  • Добавление телеметрии для проверки определенных тегов при импорте модуля (#20371)
  • Добавление PSAdapter и ConsoleGuiTools в список разрешений загрузки телеметрии модуля (#20641)
  • Добавление модуля WinGet для отслеживания использования (#21040)
  • Убедитесь, что имя файла не равно NULL при ведения журнала событий WDAC ETW (#20910) (спасибо) @jborean93!)
  • Исправлены четыре регрессии, представленные функцией ведения журнала WDAC (#20913)
  • Оставьте входные, выходные и ошибки без изменений, если они не перенаправлены (#20853)
  • Исправление неявных командлетов прокси-сервера для удаленного взаимодействия с общими параметрами (#20367)
  • Включите версию модуля в сообщения об ошибках, если модуль не найден (No 20144) (спасибо) @ArmaanMcleod!)
  • Исправление unixmode для обработки setuid и sticky когда файл не является исполняемым файлом (#20366)
  • Исправлено использование сборки для использования Path.Combine при создании путей сборки (#21169)
  • Проверьте значение использования пространства имен во время семантических проверок, чтобы предотвратить объявление недопустимых пространств имен (#21162)
  • Обработка глобального инструмента специально при подготовке $PSHOME к PATH (#24228)

Экспериментальные функции

Следующие экспериментальные функции были преобразованы в основные функции в PowerShell 7.5-rc.1:

В PowerShell 7.5-rc.1 включены следующие экспериментальные функции:

Улучшения производительности

PowerShell 7.5-rc.1 включал PR#23901 , @jborean93 что повышает производительность += операции для массива объектов.

В следующем примере измеряется производительность различных методов добавления элементов в массив.

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

При запуске скрипта в PowerShell 7.4.6 вы увидите, что использование оператора += является самым медленным методом.

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

При запуске скрипта в PowerShell 7.5-rc.1 вы увидите, что использование оператора += гораздо быстрее, чем PowerShell 7.4.6. Теперь это также быстрее, чем использование метода 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