PowerShell 7.5.2 包括以下功能、更新和重大更改。 PowerShell 7.5 基于 .NET 9.0.301 版本构建。
有关更改的完整列表,请参阅 GitHub 库中的更改日志。 有关 .NET 9 的详细信息,请参阅 [.NET 9 中的新增功能][07]。
重大更改
- 修复在使用
PathType
时Test-Path
的-OlderThan
和-NewerThan
参数和日期范围 (#20942)(感谢 @ArmaanMcleod!)- 以前,如果一起指定,将忽略
-OlderThan
- 以前,如果一起指定,将忽略
- 将
New-FileCatalog -CatalogVersion
默认值更改为 2 (#20428)(感谢 @ThomasNieto!) - 阻止在受限远程处理会话中从网络位置获取帮助 (#20593)
- Windows 安装程序现在记住使用的安装选项,并使用这些选项来初始化用于下一次安装的选项 (#20420)(谢谢 @reduckted!)
-
ConvertTo-Json
现在将BigInteger
序列化为数字 (#21000)(感谢 @jborean93!) - .NET 9 删除了
BinaryFormatter
的实现,导致Out-GridView
cmdlet 中的回归。Out-GridView
的搜索功能在 PowerShell 7.5 中不起作用。 该问题已在问题 #24749 中跟踪。
更新的模块
PowerShell 7.5.0 包含以下更新的模块:
- Microsoft.PowerShell.PSResourceGet v1.1.0
- PSReadLine v2.3.6
Tab 自动补全改进
非常感谢 @ArmaanMcleod 和其他人在改进选项卡补全方面的所有贡献。
- 当无法从安全表达式检索哈希表键值时回退到类型推理 (#21184)(谢谢 @MartinGC94!)
- 对
$_
进行类型推理时修复回归 (#21223)(谢谢 @MartinGC94!) - 使用 Tab 自动补全在 Windows 上将
~
展开到$HOME
(#21529) - 不要在声明参数名称和类成员时完成 (#21182)(谢谢 @MartinGC94!)
- 当选项卡补全类型名称时防止回退到文件补全 (#20084)(感谢 @MartinGC94)
- 为
Set-StrictMode
添加参数补全器到-Version
(#20554)(感谢 @ArmaanMcleod!) - 为
Get-Verb
/Get-Command
和重构Get-Verb
添加-Verb
参数补全器 (#20286)(感谢 @ArmaanMcleod) - 为
Start-Process
添加-Verb
参数补全器 (#20415)(感谢 @ArmaanMcleod) - 为
*-Variable
、*-Alias
&*-PSDrive
命令添加-Scope
参数补全器 (#20451)(感谢 @ArmaanMcleod) - 为
Save-Help
/Update-Help
命令添加-Module
补全 (#20678)(感谢 @ArmaanMcleod)
新 cmdlet
- 添加
ConvertTo-CliXml
和ConvertFrom-CliXml
cmdlet (#21063)(感谢 @ArmaanMcleod!)
Web cmdlet 的改进
- 修复允许
-PassThru
和-Outfile
协同工作的问题 (#24086) - 在
OutFile
中添加WebResponseObject
属性 (#24047) - 在
Invoke-WebRequest -OutFile -Verbose
中显示文件名 (#24041) - 修复了指定
-Body
但未指定ContentType
时的 WebCmdlet 问题 (#23952)(感谢 @CarloToso!) - 修复指定
-Resume
时报告正确大小的Invoke-WebRequest
(#20207)(感谢 @LNKLEO!) - 修复 Web Cmdlet 以允许
WinForm
应用正常工作 (#20606)
其他 cmdlet 改进
- 启用
-NoRestart
以与Register-PSSessionConfiguration
结合使用 (#23891) - 向
Test-Json
cmdlet 增加了IgnoreComments
和AllowTrailingCommas
选项 (#23817)(感谢 @ArmaanMcleod!) - Get-Help 可以将带
ValueFromRemainingArguments
特性的参数报告为可管道化 (#23871) - 将
Select-String
中的类型LineNumber
更改为ulong
(#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
添加到Get-ChildItem
命令的参数-Recurse
(#20100)(感谢 @kilasuit!) - 为仍然缺少别名的函数将
LP
添加到LiteralPath
别名 (#20820) - 将隐式本地化回退添加到
Import-LocalizedData
(#19896)(感谢 @chrisdent-de!) - 将
Aliases
添加到在对Get-Help
所返回参数的帮助内容格式化时显示的属性 (#20994) - 将
HelpUri
添加到Remove-Service
(#20476) - 修复 SCCM 提供程序的完成崩溃(#20815、#20919、#20915)(感谢 @MartinGC94!)
- 修复在
-Tail 0
和-Wait
一起使用时Get-Content
中的回归 (#20734)(感谢 @CarloToso!) - 修复
Start-Process -PassThru
以确保返回的Process
对象可访问ExitCode
属性 (#20749)(感谢 @CodeCyclone!) - 修复
Group-Object
以对其输出使用当前区域性 (#20608) - 修复使用内插字符串的
Group-Object
输出 (#20745)(感谢 @mawosoft!) - 修复网络
PSDrive
的DisplayRoot
呈现问题 (#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) - 向
Resolve-Path
和Convert-Path
cmdlet 增加了-Force
参数,以支持通配符隐藏文件 #20981(感谢 @ArmaanMcleod!) - 使用
-NoNewWindow
启动进程时明确设置标准句柄 (#25324) - 使继承的受保护内部实例成员在类范围内可访问。 (#25547)(谢谢) @mawosoft!)
- 删除旧的模糊建议并修复本地脚本文件名建议 (#25330)
- 修复
PSMethodInvocationConstraints.GetHashCode
方法 (#25306) (谢谢 @crazyjncsu!)
引擎改进
- 在完成方法参数的必要类型转换后,将 .NET 方法调用的日志记录移至后面(#25357)
- 在
WldpCanExecuteFile
后回退至 AppLocker (#25305) - 显式启动和停止 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!)
- 修复当文件不是可执行文件时处理
setuid
和sticky
的unixmode
(#20366) - 修复在构造程序集路径时利用程序集来使用 Path.Combine 的问题 (#21169)
- 在语义检查期间验证用于命名空间的值,以防止声明无效的命名空间 (#21162)
- 向 PATH 追加
$PSHOME
时的特别全局处理工具 (#24228)
试验性功能
以下实验性功能已转换为 PowerShell 7.5-rc.1 中的主流功能:
PowerShell 7.5-rc.1 中包括以下实验性功能:
- PSRedirectToVariable - 允许重定向到变量 (#20381)
- PSNativeWindowsTildeExpansion - 为 Windows 本机可执行文件添加波浪号展开(#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
[07]: /dotnet/core/whats-new/dotnet-9/overview)