PowerShell Core 6.2 中的新增功能

PowerShell Core 6.2 版本侧重于性能改进、bug 修复以及可提高质量的较小 cmdlet 和语言增强功能。 若要查看改进的完整列表,请在 GitHub 上查看我们详细的更改日志

实验性功能

在此之前,我们启用了对实验性功能的支持。 6\.2 版本中提供了四个要试用的实验性功能。请提供反馈,以便我们进行改进,并决定该功能是否值得提升到主流状态。

使用 Get-ExperimentalFeature 获取可用的实验性功能列表。 可以使用 Enable-ExperimentalFeatureDisable-ExperimentalFeature 启用或禁用这些功能。

命令未找到建议

此功能使用模糊匹配来查找可能键入错误的命令或 cmdlet 的建议。

Enable-ExperimentalFeature -Name PSCommandNotFoundSuggestion

示例

在本例中,拼写错误的 cmdlet 名称与多个建议模糊匹配(从最可能到最不可能)。

Get-Commnd
Get-Commnd : The term 'Get-Commnd' is not recognized as the name of a cmdlet, function, script file,
or operable program. Check the spelling of the name, or if a path was included, verify that the path
is correct and try again.
At line:1 char:1
+ Get-Commnd
+ ~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (Get-Commnd:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException


Suggestion [4,General]: The most similar commands are: Get-Command, Get-Content, Get-Job, Get-Module,
Get-Event, Get-Host, Get-Member, Get-Item, Set-Content.

隐式远程处理批处理

在管道中使用隐式远程处理时,PowerShell 将独立处理管道中的每个命令。 在管道执行过程中,对象在客户端和远程系统之间重复序列化和 de-serialized

PowerShell 使用该功能分析管道,以确定该命令是否可以安全运行,以及它是否存在于目标系统中。 如果为 true,PowerShell 将远程执行整个管道,并且只将结果序列化和 de-serializes 返回给客户端。

Enable-ExperimentalFeature -Name PSImplicitRemotingBatching

在 localhost 上实际测试 Get-Process | Sort-Object 的时间从 10-15 秒减少到 20-30 毫秒。 该功能只需在客户端上启用。 不需要在服务器上进行任何更改。

临时驱动器

Enable-ExperimentalFeature -Name PSTempDrive

如果在不同操作系统上使用 PowerShell Core,会发现在 Windows、macOS 和 Linux 上用于查找临时目录的环境变量是不同的! 借助此功能,可获得一个名为 Temp:PSDrive,它将自动映射到你正在使用的操作系统的临时文件夹。

示例

PS> "Hello World!" > Temp:/hello.txt
PS> Get-Content Temp:/hello.txt
Hello World!

注意,本机文件命令(如 Linux 上的 ls)不能识别 PSDrive,因此看不到此 Temp: 驱动器。

缩写扩展

PowerShell cmdlet 应具有描述性名词。 这将导致更难键入的长名称。 该功能允许只键入 cmdlet 的大写字符,并使用 Tab 自动补全查找匹配项。

Enable-ExperimentalFeature -Name PSUseAbbreviationExpansion

示例

PS> i-arsavsf

如果按 Tab 键,并安装了 Azure PowerShell Az 模块,它将自动完成为:

PS> Import-AzRecoveryServicesAsrVaultSettingsFile

注意

此功能旨在以交互方式使用。 不能执行 cmdlet 的缩写形式。 此功能不能替代别名。

重大更改

  • 修复 Write-Output 中的 -NoEnumerate 行为,使之与 Windows PowerShell 一致。 (#9069)
  • 使 Join-String -InputObject 1,2,3 结果等于 1,2,3 | Join-String 结果 (#8611) (谢谢 @sethvs!)
  • 添加到 -StableSort-Object 和相关测试 (#7862) (谢谢 @KirkMunro!)
  • 改进 Start-Sleep cmdlet 以接受秒的小数部分 (#8537) (谢谢 @Prototyyppi!)
  • 将 Hashtable 更改为在所有区域性中使用 OrdinalIgnoreCase 作为 case-insensitive (#8566)
  • 修复 了 中的 Import-CsvLiteralPath 以绑定到Get-ChildItem输出 (#8277) (谢谢@iSazonov!)
  • 如果在 (#7899 中使用 Import-Csv 双引号分隔符,则不再跳过没有名称的列) (谢谢 @Topping!)
  • Get-ExperimentalFeature 不再具有 -ListAvailable 开关 (#8318)
  • Debug 参数现在设置为 $DebugPreferenceContinue 而不是 “查询 (#8195) (谢谢” @KirkMunro!)
  • 如果在与 pwsh 一起使用的非交互式、重定向、编码命令中指定 -OutputFormat,则采用该指定项 (#8115)
  • 在尝试从 GAC 加载程序集之前,先从模块基路径加载程序集 (#8073)
  • 从 Linux 预览包中删除波形符 (#8244)
  • 先移动处理 -WorkingDirectory 再处理配置文件 (#8079)
  • 请勿在 Unix (#7697 上添加 PATHEXT 环境变量,) (谢谢 @iSazonov!)

已知问题

  • 在 Windows IOT ARM 平台上进行的远程处理存在模块加载问题。 请参阅 (#8053)

常规更新和修补程序

  • 在区分大小写的文件系统上为文件和文件夹启用不区分大小写的 Tab 自动补全 (#8128)
  • 使 PSVersionInfo.PSVersion 和 PSVersionInfo.PSEdition 公开 (#8054) (谢谢 @KirkMunro!)
  • 在块中添加 catch{ } 的类型$_ / $PSItem推理 (#8020) (谢谢@vexx32!)
  • 修复静态方法调用类型推理 (#8018) (谢谢 @SeeminglyScience!)
  • Create 、Group-Object、PSObjectHashtable (#7231 的推断类型 Select-Object) (谢谢@powercode!)
  • 支持使用 ByRef-like 类型参数的调用方法 (#7721)
  • 处理 Windows PowerShell 模块路径已在环境的 PSModulePath 中的情况 (#7727)
  • 通过存储纯文本来启用适用于非 Windows 的 SecureString cmdlet (#9199)
  • 使用 securestring 导入 clixml 时,改进非 Windows 上的错误消息 (#7997)
  • 将参数 ReplyTo 添加到 Send-MailMessage (#8727) (谢谢 @replicaJunction!)
  • 将已过时的消息添加到 Send-MailMessage (#9178)
  • 修复 Restart-Computer,以便在 WinRM 不存在时使用 localhost (#9160)
  • 正在托管 PowerShell 时,使 Start-Job 引发终止错误 (#9128)
  • 为 ushort、uint、ulong 和短文本添加 C# 样式类型快捷方式和后缀 (#7813) (谢谢 @vexx32!)
  • 添加了数字文本的新后缀 - 请参阅 about_Numeric_Literals (#7901) (谢谢 @vexx32!)
  • 当 SupportsShouldProcess 未设置为“true”时正确报告影响级别 (#8209) (谢谢 @vexx32!)
  • 修复 Web Cmdlet 中的请求字符集问题 (#8742) (谢谢 @markekraus!)
  • 修复 Web Cmdlet (#8679) (预期 100-continue 问题 谢谢 @markekraus!)
  • 修复了 web cmdlet (#7676 的文件阻塞问题) (谢谢 @Claustn!)
  • 修复了 (#8694 中的 Invoke-RestMethod 代码页分析问题,) (谢谢 @markekraus!)
  • 重构 ConvertTo-Json 以将 JsonObject.ConvertToJson 公开为公共 API (#8682)
  • 在 中添加 ConvertFrom-Json 可配置的最大深度-Depth (#8199) (谢谢 @louistio!)
  • ConvertTo-Json cmdlet (#7775 中添加 EscapeHandling 参数) (谢谢 @iSazonov!)
  • -CustomPipeName 添加到 pwsh 和 Enter-PSHostProcess (#8889)
  • 使用 New-Item 在 Windows 上启用创建相对符号链接 (#8783)
  • 允许 Windows 用户在开发人员模式下创建符号链接,而不需要提升 (#8534)
  • 启用 Write-Information 以接受 $null (#8774)
  • 使用 MAML 帮助内容修复高级函数的 Get-Help (#8353)
  • 修复 Get-Help 了当仅声明一个参数 (#8754 时 -Parameter 的 PSTypeName 问题) (谢谢 @pougetat!)
  • 针对在 ScriptBlock 上执行的 Get-Help 进行令牌计算修复,以获得注释帮助。 (#8238) (谢谢 @hubuk!)
  • 更改 Get-Help cmdlet -Parameter 参数,使其接受字符串数组 (#8454) (谢谢 @sethvs!)
  • 解决 PAGER 的路径是否包含空格 (#8571) (谢谢 @pougetat!)
  • 在“help”函数中添加 less 的使用提示,以指导用户如何退出 (#7998)
  • Format-Hex cmdlet (#8191 中添加支持枚举和字符类型) (谢谢 @iSazonov!)
  • Format-Hex 中删除 ShouldProcess (#8178)
  • 将新的 Offset 和 Count 参数添加到 Format-Hex cmdlet (#7877 并重构) (谢谢 @iSazonov!)
  • 允许将“name”作为 中 ConvertTo-Html“label”的别名键,允许“width”条目为整数 (#8426) (谢谢 @mklement0!)
  • 让基于脚本块的计算属性在 ConvertTo-Html (#8427) (再次正常工作 谢谢 @mklement0!)
  • 添加用于从管道输入创建文本的 cmdlet Join-String (#7660) (谢谢 @powercode!)
  • 修复 Join-String cmdlet FormatString 参数逻辑 (#8449) (谢谢 @sethvs!)
  • Clear-Host 更改回使用 $RAWUI 并清除以进行远程操作 (#8609)
  • 更改 Clear-Host 以简单地调用 [console]::clear,并从 Unix 中删除清晰别名 (#8603)
  • 修复 了 中的 Import-Csv LiteralPath 以绑定到 Get-ChildItem 输出 (#8277) (谢谢 @iSazonov!)
  • help 函数不应为 AliasHelpInfo 使用寻呼程序 (#8552)
  • Start-Transcript 添加到 -UseMinimalHeader 以最小化脚本标头 (#8402) (谢谢@lukexjeremy!)
  • 添加 Enable-ExperimentalFeatureDisable-ExperimentalFeature cmdlet (#8318)
  • 如果 logman.exe 可用,则公开 PSDiagnostics 中的所有 cmdlet (#8366)
  • New-PSDrivenon-Windows平台 (#8291 中删除 Persist 参数) (谢谢@lukexjeremy!)
  • 添加对 cd + (#7206 的支持) (谢谢 @bergmeister!)
  • 使 Set-Location -LiteralPath 能够使用名为 - 和 + 的文件夹 (#8089)
  • Test-Path$false当给定空或$null路径值 (#8080 时返回) (谢谢@vexx32!)
  • 允许返回动态参数,即使路径不匹配任何提供程序 (#7957)
  • 在 Unix 平台上支持 Get-PSHostProcessInfoEnter-PSHostProcess (#8232)
  • 减少 cmdlet (#8103 中的分配 Get-Content) (谢谢 @iSazonov!)
  • 允许 Add-Content 在编写内容时与其他工具共享读取访问 (#8091)
  • Get/Add-Content 在面向容器时引发改进的错误 (#7823) (谢谢 @kvprasoon!)
  • 将 、 -NoUserOverrides-ListAvailable 参数添加到 Get-Culture-Namecmdlet (#7702) (谢谢@iSazonov!)
  • 为完成 Encoding 参数添加统一属性。 (#7732) (谢谢 @ThreeFive-O!)
  • 编码 参数 (#7636 中允许注册代码页的数字 ID 和名称) (谢谢 @iSazonov!)
  • 修复 Rename-Item -Path 通配符字符 (#7398) (谢谢 @kwkam!)
  • 使用 Start-Transcript 和 文件时,文件为空,而不是删除 (#8131) (谢谢 @paalbra!)
  • 使用 Add-TypeFileAccess.ReadFileShare.Read 显式创建开放源代码文件 (#7915) (谢谢@IISResetMe!)
  • 修复最新 Windows 的 Enter-PSSession -ContainerId (#7883)
  • 请确保 NestedModules 属性由 Test-ModuleManifest 填充 (#7859)
  • 将大小写添加到 %FGet-Date -UFormat (#7630) (谢谢 @britishben!)
  • 修复 Set-Service -Status Stopped 了 停止具有依赖项的服务 (#5525) (谢谢 @zhenggu!)