PowerShell 7.5 中的新增功能
PowerShell 7.5-rc.1 包括以下功能、更新和重大变更。 PowerShell 7.5 基于 .NET 9.0.100 GA 版本构建。
有关更改的完整列表,请参阅 GitHub 库中的更改日志。
重大更改
- 修复在使用
-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-rc.1 包含以下更新的模块:
- Microsoft.PowerShell.PSResourceGet v1.1.0-RC2
- PSReadLine v2.3.6
Tab 自动补全改进
非常感谢 @ArmaanMcleod 和其他人在改进选项卡补全方面的所有贡献。
- 当无法从安全表达式检索哈希表键值时回退到类型推理 (#21184)(谢谢 @MartinGC94!)
- 对
$_
进行类型推理时修复回归 (#21223)(谢谢 @MartinGC94!) - 使用 Tab 自动补全在 Windows 上将
~
展开到$home
(#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
补全 (#20678)(感谢 @ArmaanMcleod)
新 cmdlet
- 增加了
ConvertTo-CliXml
和ConvertFrom-CliXml
cmdlet (#21063)(诚挚感谢 @ArmaanMcleod!))
Web cmdlet 改进
- 修复以允许
-PassThru
和-Outfile
协同工作(#24086) - 在
WebResponseObject
中添加OutFile
属性(#24047) - 在
Invoke-WebRequest -OutFile -Verbose
中显示文件名(#24041) - 修复了指定
-Body
但未指定ContentType
时的 WebCmdlet 问题 (#23952)(诚挚感谢 @CarloToso!)) - 修复指定
Invoke-WebRequest
时报告正确大小的-Resume
(#20207)(感谢 @LNKLEO!) - 修复 Web Cmdlet 以允许
WinForm
应用正常工作 (#20606)
其他 cmdlet 改进
- 启用
-NoRestart
以与Register-PSSessionConfiguration
结合使用 (#23891) IgnoreComments
cmdlet 增加了AllowTrailingCommas
和Test-Json
选项 (#23817)(诚挚感谢 @ArmaanMcleod!))- Get-Help 可以将带
ValueFromRemainingArguments
属性的参数报告为可管道化 (#23871) - 将
LineNumber
中的类型ulong
更改为Select-String
(#24075)(诚挚感谢 @Snowman-25!)) Get-Process
:删除-IncludeUserName
的管理员要求 (#21302)(谢谢 @jborean93!)- 修复
Test-Path -IsValid
以检查无效的路径和文件名字符 (#21358) - 将
RecommendedAction
添加到错误报告的ConciseView
(#20826)(谢谢 @JustinGrote!) - 为
Remove-Item
cmdlet 添加了进度栏 (#20778)(谢谢 @ArmaanMcleod!) - 修复 .NET 8 更改导致的
Test-Connection
(#20369) - 修复
Get-Service
非终止错误消息以包括类别 (#20276) - 将
-Empty
和-InputObject
参数添加到New-Guid
(#20014)(感谢 @CarloToso!) - 将别名
r
添加到-Recurse
命令的参数Get-ChildItem
(#20100)(感谢 @kilasuit!) - 为仍然缺少别名的函数将
LP
添加到LiteralPath
别名 (#20820) - 将隐式本地化回退添加到
Import-LocalizedData
(#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
输出 (#20745)(感谢 @mawosoft!) - 修复网络
DisplayRoot
的PSDrive
呈现问题 (#20793) - 修复
Copy-Item
进度,仅在复制完所有文件时显示已完成 (#20517) - 修复 UNC 路径完成回归 (#20419)(感谢 @MartinGC94!)
- 无效的
-ExecutionPolicy
传递给pwsh
时将报告错误 (#20460) - 添加 WinGetCommandNotFound 和 CompletionPredictor 模块来跟踪使用情况 (#21040)
- 将 DateKind 参数添加到
ConvertFrom-Json
(#20925)(感谢 @jborean93!) - 将 DirectoryInfo 添加到 New-Item 的 OutputType (#21126)(感谢 @MartinGC94!)
- 修复了数组值的
Get-Error
序列化问题 (#21085)(诚挚感谢 @jborean93!)) - 修复了
Test-ModuleManifest
,使其可以使用 UNC 路径 (#24115) - 修复了
Get-TypeData
以立即写入管道而不是先收集数据 (#24236)(诚挚感谢 @MartinGC94)) -Force
和Resolve-Path
cmdlet 增加了Convert-Path
参数,以支持通配符隐藏文件 #20981(诚挚感谢 @ArmaanMcleod!))
引擎改进
- 显式启动和停止 ANSI 错误颜色 (#24065)(诚挚感谢 @JustinGrote!))
- 完善了泛型方法的 .NET 重载定义 (#21326)(诚挚感谢 @jborean93!))
- 优化了当集合是对象数组时的
+=
操作 (#23901)(诚挚感谢 @jborean93!)) - 添加遥测以在导入模块时检查特定标记 (#20371)
- 将
PSAdapter
和ConsoleGuiTools
添加到模块加载遥测允许列表 (#20641) - 添加 Winget 模块以跟踪使用情况 (#21040)
- 记录 WDAC ETW 事件时确保文件名不为 null (#20910)(感谢 @jborean93!)
- 修复 WDAC 日志记录功能引入的四个回归 (#20913)
- 在未重定向输入、输出和错误时保留输入、输出和错误句柄未设置 (#20853)
- 修复隐式远程处理代理 cmdlet 以处理常见参数 (#20367)
- 找不到模块时在错误消息中包含模块版本 (#20144)(感谢 @ArmaanMcleod!)
- 修复当文件不是可执行文件时处理
unixmode
和setuid
的sticky
(#20366) - 修复在构造程序集路径时利用程序集来使用 Path.Combine 的问题 (#21169)
- 在语义检查期间验证用于命名空间的值,以防止声明无效的命名空间 (#21162)
- 向路径追加
$PSHome
时的特别全局处理工具 (#24228)
实验性功能
以下实验性功能已转换为 PowerShell 7.5-rc.1 中的主流功能:
PowerShell 7.5-rc.1 中包括以下实验性功能:
- PSRedirectToVariable - 允许重定向到变量 (#20381)
- PSNativeWindowsTildeExpansion - 为 Windows 原生可执行文件添加 TILDE 扩展 (#20402)(诚挚感谢 @domsleee!))
- PSSerializeJSONLongEnumAsNumber -
ConvertTo-Json
现在将大型枚举视为数字 (#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