Новые возможности PowerShell 7.5
PowerShell 7.5.0 включает следующие функции, обновления и критические изменения. PowerShell 7.5 основан на выпуске общедоступной версии .NET 9.0.1.
Полный список изменений доступен в журнале изменений в репозитории GitHub. Дополнительные сведения о .NET 9 см. в статье [Новые возможности .NET 9][07].
Критические изменения
- Исправление
-OlderThan
и-NewerThan
параметры дляTest-Path
диапазона датPathType
(#20942) (спасибо)@ArmaanMcleod!)- Ранее было
-OlderThan
бы проигнорировано, если указано вместе
- Ранее было
- Измените
New-FileCatalog -CatalogVersion
значение по умолчанию на 2 (#20428) (спасибо)@ThomasNieto!) - Блокировать получение справки из сетевых расположений в сеансах удаленного взаимодействия с ограниченным доступом (No 20593)
- Установщик Windows теперь запоминает используемые параметры установки и использует их для инициализации параметров следующей установки (#20420) (спасибо)@reduckted!)
-
ConvertTo-Json
теперь сериализуетсяBigInteger
как число (#21000) (спасибо)@jborean93!) - .NET 9 удалил реализацию
BinaryFormatter
, вызвав регрессию в командлетеOut-GridView
. Функция поискаOut-GridView
не работает в PowerShell 7.5. Эта проблема отслеживается в по задаче #24749.
Обновленные модули
PowerShell 7.5.0 включает следующие обновленные модули:
- Microsoft.PowerShell.PSResourceGet версии 1.1.0
- PSReadLine версии 2.3.6
Улучшения для заполнения нажатием клавиши TAB
Многие благодаря @ArmaanMcleod и другим людям за всю свою работу по улучшению завершения вкладки.
- Возврат к выводу типа, когда хэш-значение ключа невозможно извлечь из безопасного выражения (#21184) (спасибо)@MartinGC94!)
- Исправлена регрессия при выводе
$_
типа (No 21223) (спасибо)@MartinGC94!) - Развертывание
~
в$home
Windows с завершением вкладки (No 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
команд (#20451) (спасибо)@ArmaanMcleod) - Добавление
-Module
завершения дляSave-Help
/Update-Help
команд (No 20678) (спасибо)@ArmaanMcleod)
Новые командлеты
- Добавление
ConvertTo-CliXml
иConvertFrom-CliXml
командлеты (No 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)
Другие улучшения командлетов
- Включение
-NoRestart
работы сRegister-PSSessionConfiguration
(#23891) - Добавление
IgnoreComments
иAllowTrailingCommas
параметры командлетаTest-Json
(#23817) (спасибо)@ArmaanMcleod!) - Get-Help может сообщать параметры с атрибутом в
ValueFromRemainingArguments
качестве конвейера (#23871) - Тип
LineNumber
ulong
изменения вSelect-String
(No 24075) (спасибо)@Snowman-25!) -
Get-Process
: удаление требования администратора для-IncludeUserName
(No 21302) (спасибо)@jborean93!) - Исправлено
Test-Path -IsValid
, чтобы проверить наличие недопустимых символов пути и имени файла (No 21358) - Добавление
RecommendedAction
вConciseView
отчеты об ошибках (No 20826) (спасибо)@JustinGrote!) - Добавлена индикатор выполнения для
Remove-Item
командлета (No 20778) (спасибо)@ArmaanMcleod!) - Исправление
Test-Connection
из-за изменений .NET 8 (#20369) - Исправление
Get-Service
без конца сообщения об ошибке для включения категории (#20276) - Добавление
-Empty
и-InputObject
параметры вNew-Guid
(No 20014) (спасибо)@CarloToso!) - Добавьте псевдоним
r
в параметр-Recurse
дляGet-ChildItem
команды (#20100) (спасибо)@kilasuit!) - Добавьте
LP
вLiteralPath
псевдонимы для функций, которые по-прежнему отсутствуют (No 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
совместном использовании (No 20734) (спасибо)@CarloToso!) - Исправление
Start-Process -PassThru
, чтобы убедиться, чтоExitCode
свойство доступно для возвращаемогоProcess
объекта (#20749) (спасибо)@CodeCyclone!) - Исправление
Group-Object
использования текущего языка и региональных параметров для выходных данных (No 20608) - Исправление
Group-Object
выходных данных с помощью интерполированных строк (No 20745) (спасибо)@mawosoft!) - Исправлена отрисовка
DisplayRoot
для сетиPSDrive
(No 20793) - Исправление
Copy-Item
хода выполнения только после копирования всех файлов (#20517) - Исправлена регрессия завершения пути 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-путь (No 24115) - Исправление
Get-TypeData
для записи в конвейер немедленно, а не сначала сбор данных (#24236) (спасибо)@MartinGC94) - Добавление
-Force
параметра иResolve-Path
Convert-Path
командлетов для поддержки скрытых файлов подстановочных знаков #20981 (спасибо @ArmaanMcleod!)
Улучшения подсистемы
- Явный запуск и остановка цвета ошибки ANSI (No 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 включены следующие экспериментальные функции:
- PSRedirectToVariable — разрешить перенаправление в переменную (#20381)
- PSNativeWindowsTildeExpansion — добавление расширения тильды для собственных исполняемых файлов Windows (No 20402) (спасибо)@domsleee!)
-
PSSerializeJSONLongEnumAsNumber -
ConvertTo-Json
теперь обрабатывает большие перечисления как числа (No 20999) (спасибо)@jborean93!)
Улучшения производительности
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
[07]: /dotnet/core/whats-new/dotnet-9/overview)
PowerShell