PowerShell 7.5 中的新增功能

PowerShell 7.5-rc.1 包括以下功能、更新和重大变更。 PowerShell 7.5 基于 .NET 9.0.100 GA 版本构建。

有关更改的完整列表,请参阅 GitHub 库中的更改日志

重大更改

  • 修复在使用 -OlderThan-NewerThanTest-PathPathType 参数和日期范围 (#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!)
  • -VerbGet-Verb/ 和重构 Get-Command 添加 Get-Verb 参数补全器 (#20286)(感谢 @ArmaanMcleod)
  • -Verb 添加 Start-Process 参数补全器 (#20415)(感谢 @ArmaanMcleod)
  • -Scope*-Variable*-Alias 命令添加 *-PSDrive 参数补全器 (#20451)(感谢 @ArmaanMcleod)
  • -ModuleSave-Help/命令添加 Update-Help 补全 (#20678)(感谢 @ArmaanMcleod)

新 cmdlet

  • 增加了 ConvertTo-CliXmlConvertFrom-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 增加了 AllowTrailingCommasTest-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!)
  • 修复网络 DisplayRootPSDrive 呈现问题 (#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))
  • -ForceResolve-Path cmdlet 增加了 Convert-Path 参数,以支持通配符隐藏文件 #20981(诚挚感谢 @ArmaanMcleod!))

引擎改进

  • 显式启动和停止 ANSI 错误颜色 (#24065)(诚挚感谢 @JustinGrote!))
  • 完善了泛型方法的 .NET 重载定义 (#21326)(诚挚感谢 @jborean93!))
  • 优化了当集合是对象数组时的 += 操作 (#23901)(诚挚感谢 @jborean93!))
  • 添加遥测以在导入模块时检查特定标记 (#20371)
  • PSAdapterConsoleGuiTools 添加到模块加载遥测允许列表 (#20641)
  • 添加 Winget 模块以跟踪使用情况 (#21040)
  • 记录 WDAC ETW 事件时确保文件名不为 null (#20910)(感谢 @jborean93!)
  • 修复 WDAC 日志记录功能引入的四个回归 (#20913)
  • 在未重定向输入、输出和错误时保留输入、输出和错误句柄未设置 (#20853)
  • 修复隐式远程处理代理 cmdlet 以处理常见参数 (#20367)
  • 找不到模块时在错误消息中包含模块版本 (#20144)(感谢 @ArmaanMcleod!)
  • 修复当文件不是可执行文件时处理 unixmodesetuidsticky (#20366)
  • 修复在构造程序集路径时利用程序集来使用 Path.Combine 的问题 (#21169)
  • 在语义检查期间验证用于命名空间的值,以防止声明无效的命名空间 (#21162)
  • 向路径追加 $PSHome 时的特别全局处理工具 (#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