当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] Windows PowerShell 5.1 和 PowerShell 7.x 之间的差异

作者:精品下载站 日期:2024-12-14 03:00:41 浏览:15 分类:玩电脑

Windows PowerShell 5.1 和 PowerShell 7.x 之间的差异


Windows PowerShell 5.1 构建于 .NET Framework v4.5 之上。随着 PowerShell 6.0 的发布,PowerShell 成为基于 .NET Core 2.0 构建的开源项目。从 .NET Framework 迁移到 .NET Core 使 PowerShell 成为跨平台解决方案。 PowerShell 在 Windows、macOS 和 Linux 上运行。

Windows PowerShell 和 PowerShell 之间的 PowerShell 语言几乎没有差异。最显着的差异在于 Windows 和非 Windows 平台之间 PowerShell cmdlet 的可用性和行为,以及因 .NET Framework 和 .NET Core 之间的差异而产生的变化。

本文总结了 Windows PowerShell 与当前版本的 PowerShell 之间的显着差异和重大更改。此摘要不包括已添加的新功能或 cmdlet。本文也不讨论版本之间的更改。本文的目标是介绍 PowerShell 的当前状态以及它与 Windows PowerShell 的不同之处。有关版本之间的更改和新功能添加的详细讨论,请参阅每个版本的新增功能文章。

  • PowerShell 7.5 中的新增功能
  • PowerShell 7.4 中的新增功能
  • PowerShell 7.3 中的新增功能
  • PowerShell 7.2 中的新增功能
  • PowerShell 7.1 中的新增功能
  • PowerShell 7.0 中的新增功能
  • PowerShell 6.x 中的新增功能

.NET Framework 与 .NET Core

Linux 和 macOS 上的 PowerShell 使用 .NET core,它是 Microsoft Windows 上完整 .NET Framework 的子集。这很重要,因为 PowerShell 提供了对底层框架类型和方法的直接访问。因此,由于框架的差异,在 Windows 上运行的脚本可能无法在非 Windows 平台上运行。有关 .NET Core 中的更改的详细信息,请参阅从 .NET Framework 迁移到 .NET Core 的重大更改。

每个新版本的 PowerShell 都是基于较新版本的 .NET 构建的。 .NET 中可能存在影响 PowerShell 的重大更改。

  • PowerShell 7.5 - 基于 .NET 9.0 构建
  • PowerShell 7.4 - 基于 .NET 8.0 构建
  • PowerShell 7.3 - 基于 .NET 7.0 构建
  • PowerShell 7.2(LTS-当前)- 基于 .NET 6.0(LTS-当前)构建
  • PowerShell 7.1 - 基于 .NET 5.0 构建
  • PowerShell 7.0 (LTS) - 基于 .NET Core 3.1 (LTS) 构建
  • PowerShell 6.2 - 基于 .NET Core 2.1 构建
  • PowerShell 6.1 - 基于 .NET Core 2.1 构建
  • PowerShell 6.0 - 基于 .NET Core 2.0 构建

随着.NET Standard 2.0的出现,PowerShell无需修改即可加载许多传统的Windows PowerShell模块。此外,PowerShell 7 还包括 Windows PowerShell 兼容性功能,允许您使用仍需要完整框架的 Windows PowerShell 模块。

欲了解更多信息,请参阅:

  • about_Windows_PowerShell_兼容性
  • PowerShell 7 模块兼容性

注意 .NET 方法的更改

虽然 .NET 方法更改并非特定于 PowerShell,但它们可能会影响您的脚本,特别是当您直接调用 .NET 方法时。此外,构造函数可能会有新的重载。这可能会影响您使用 New-Object[type]::new() 方法创建对象的方式。

例如,.NET 向 [System.String]::Split() 方法添加了 .NET Framework 4.5 中不可用的重载。以下列表显示了 Windows PowerShell 5.1 中可用的 Split() 方法的重载:

PS> "".Split

OverloadDefinitions
-------------------
string[] Split(Params char[] separator)
string[] Split(char[] separator, int count)
string[] Split(char[] separator, System.StringSplitOptions options)
string[] Split(char[] separator, int count, System.StringSplitOptions options)
string[] Split(string[] separator, System.StringSplitOptions options)
string[] Split(string[] separator, int count, System.StringSplitOptions options)

以下列表显示了 PowerShell 7 中可用的 Split() 方法的重载:

"".Split

OverloadDefinitions
-------------------
string[] Split(char separator, System.StringSplitOptions options)
string[] Split(char separator, int count, System.StringSplitOptions options)
string[] Split(Params char[] separator)
string[] Split(char[] separator, int count)
string[] Split(char[] separator, System.StringSplitOptions options)
string[] Split(char[] separator, int count, System.StringSplitOptions options)
string[] Split(string separator, System.StringSplitOptions options)
string[] Split(string separator, int count, System.StringSplitOptions options)
string[] Split(string[] separator, System.StringSplitOptions options)
string[] Split(string[] separator, int count, System.StringSplitOptions options)

在 Windows PowerShell 5.1 中,您可以将字符数组 (char[]) 作为 字符串 传递给 Split() 方法。该方法在数组中出现任何字符时分割目标字符串。以下命令在 Windows PowerShell 5.1 中拆分目标字符串,但在 PowerShell 7 中则不然:

# PowerShell 7 example
"1111p2222q3333".Split('pq')
1111p2222q3333

要绑定到正确的重载,您必须将字符串类型转换为字符数组:

# PowerShell 7 example
"1111p2222q3333".Split([char[]]'pq')
1111
2222
3333

PowerShell 不再附带模块

出于各种兼容性原因,PowerShell 中不再包含以下模块。

  • 伊势
  • Microsoft.PowerShell.LocalAccounts
  • Microsoft.PowerShell.ODataUtils
  • Microsoft.PowerShell.Operation.Validation
  • PS预定作业
  • PS工作流程
  • PS工作流程实用程序

PowerShell 工作流程

PowerShell 工作流是 Windows PowerShell 中的一项功能,它构建在 Windows Workflow Foundation (WF) 之上,支持为长时间运行或并行任务创建强大的 Runbook。

由于 .NET Core 中缺乏对 Windows Workflow Foundation 的支持,我们从 PowerShell 中删除了 PowerShell Workflow。

将来,我们希望在 PowerShell 语言中启用本机并行/并发,而不需要 PowerShell 工作流。

如果在操作系统重新启动后需要使用检查点来恢复脚本,我们建议使用任务计划程序在操作系统启动时运行脚本,但脚本需要维护自己的状态(例如将其保存到文件中)。

从 PowerShell 中删除的 Cmdlet

对于 PowerShell 中包含的模块,由于各种兼容性原因或使用不受支持的 API,以下 cmdlet 已从 PowerShell 中删除。

CimCmdlets

    Export-BinaryMiLog

    Microsoft.PowerShell.Core

      Add-PSSnapin
      Export-Console
      Get-PSSnapin
      Remove-PSSnapin
      Resume-Job
      Suspend-Job

      Microsoft.PowerShell.Diagnostics

        Export-Counter
        Import-Counter

        Microsoft.PowerShell.Management

          Add-Computer
          Checkpoint-Computer
          Clear-EventLog
          Complete-Transaction
          Disable-ComputerRestore
          Enable-ComputerRestore
          Get-ComputerRestorePoint
          Get-ControlPanelItem
          Get-EventLog
          Get-Transaction
          Get-WmiObject
          Invoke-WmiMethod
          Limit-EventLog
          New-EventLog
          New-WebServiceProxy
          Register-WmiEvent
          Remove-Computer
          Remove-EventLog
          Remove-WmiObject
          Reset-ComputerMachinePassword
          Restore-Computer
          Set-WmiInstance
          Show-ControlPanelItem
          Show-EventLog
          Start-Transaction
          Test-ComputerSecureChannel
          Undo-Transaction
          Use-Transaction
          Write-EventLog

          Microsoft.PowerShell.Utility

            Convert-String
            ConvertFrom-String

            PS期望状态配置

              Disable-DscDebug
              Enable-DscDebug
              Get-DscConfiguration
              Get-DscConfigurationStatus
              Get-DscLocalConfigurationManager
              Publish-DscConfiguration
              Remove-DscConfigurationDocument
              Restore-DscConfiguration
              Set-DscLocalConfigurationManager
              Start-DscConfiguration
              Stop-DscConfiguration
              Test-DscConfiguration
              Update-DscConfiguration

              WMI v1 cmdlet

              以下 WMI v1 cmdlet 已从 PowerShell 中删除:

                Register-WmiEvent
                Set-WmiInstance
                Invoke-WmiMethod
                Get-WmiObject
                Remove-WmiObject

                CimCmdlets 模块(又名 WMI v2)cmdlet 执行相同的功能并提供新功能和重新设计的语法。

                已删除 New-WebServiceProxy cmdlet

                .NET Core 不支持 Windows Communication Framework,该框架提供使用 SOAP 协议的服务。此 cmdlet 已被删除,因为它需要 SOAP。

                已删除 *-Transaction cmdlet

                这些 cmdlet 的用途非常有限。决定停止对他们的支持。

                  Complete-Transaction
                  Get-Transaction
                  Start-Transaction
                  Undo-Transaction
                  Use-Transaction

                  *-EventLog cmdlet

                  由于使用了不受支持的 API,*-EventLog cmdlet 已从 PowerShell 中删除。 Get-WinEventNew-WinEvent 可用于在 Windows 上获取和创建事件。

                  使用 Windows 演示框架 (WPF) 的 Cmdlet

                  .NET Core 3.1 添加了对 WPF 的支持,因此 PowerShell 7.0 的发布恢复了以下 Windows 特定功能:

                  • Show-Command cmdlet
                  • Out-GridView cmdlet
                  • Get-HelpShowWindow 参数

                  PowerShell 所需状态配置 (DSC) 更改

                  Invoke-DscResource 已恢复为 PowerShell 7.0 中的实验功能。

                  从 PowerShell 7.2 开始,PSDesiredStateConfiguration 模块已从 PowerShell 中删除,并已发布到 PowerShell 库。有关更多信息,请参阅 PowerShell 团队博客中的公告。

                  PowerShell 可执行文件更改

                  powershell.exe 重命名为 pwsh.exe

                  PowerShell 的二进制名称已从 powershell(.exe) 更改为 pwsh(.exe)。此更改为用户在计算机上运行 PowerShell 并支持 Windows PowerShell 和 PowerShell 的并行安装提供了一种确定的方式。

                  powershell.exepwsh(.exe) 的其他更改:

                  • 将第一个位置参数从 -Command 更改为 -File。此更改修复了从非 Windows 平台上的非 PowerShell shell 执行的 PowerShell 脚本中使用 #!(又名 shebang)的问题。这还意味着您可以运行 pwsh foo.ps1pwsh fooScript 等命令,而无需指定 -File。但是,此更改要求您在尝试运行 pwsh.exe -Command Get-Command 等命令时显式指定 -c-Command
                  • pwsh 接受 -i(或 -Interactive)开关来指示交互式 shell。这允许 PowerShell 用作 Unix 平台上的默认 shell。
                  • pwsh.exe 中删除了参数 -ImportSystemModules-PSConsoleFile
                  • 更改了 pwsh -versionpwsh.exe 的内置帮助,以与其他本机工具保持一致。
                  • -File-Command 的参数错误消息和退出代码与 Unix 标准一致
                  • 在 Windows 上添加了 -WindowStyle 参数。同样,非 Windows 平台上基于包的安装更新是就地更新。

                  缩短的名称也与非 Windows 平台上 shell 的命名一致。

                  支持使用 bool 参数运行 PowerShell 脚本

                  以前,使用 pwsh.exe 使用 -File 执行 PowerShell 脚本无法传递 $true/$false 作为参数值。添加了对 $true/$false 作为参数解析值的支持。还支持开关值。

                  改进了与 Windows PowerShell 的向后兼容性

                  对于 Windows,在 Import-Module 中添加了新的开关参数 UseWindowsPowerShell。此开关在 PowerShell 7 中创建一个代理模块,该模块使用本地 Windows PowerShell 进程隐式运行该模块中包含的任何 cmdlet。有关更多信息,请参阅导入模块。

                  有关哪些 Microsoft 模块可与 PowerShell 7.0 配合使用的更多信息,请参阅模块兼容性表。

                  Microsoft 更新对 Windows 的支持

                  PowerShell 7.2 添加了对 Microsoft 更新的支持。启用此功能后,您将在传统的 Windows Update (WU) 管理流程中获取最新的 PowerShell 7 更新,无论是使用适用于企业的 Windows Update、WSUS、SCCM 还是“设置”中的交互式 WU 对话框。

                  PowerShell 7.2 MSI 包包含以下命令行选项:

                  • USE_MU - 该属性有两个可能的值:

                    • 1(默认)- 选择通过 Microsoft Update 或 WSUS 进行更新
                  • 0 - 不要选择通过 Microsoft Update 或 WSUS 进行更新
                • ENABLE_MU

                  • 1(默认)- 选择使用 Microsoft Update 自动更新或 Windows Update
                • 0 - 不要选择使用 Microsoft Update 自动更新或 Windows Update
                • 发动机变化

                  支持 PowerShell 作为默认 Unix shell

                  在 Unix 上,shell 的约定是接受 -i 作为交互式 shell,许多工具都期望这种行为(例如 script,以及将 PowerShell 设置为默认 shell 时) )并使用 -i 开关调用 shell。此更改打破了 -i 以前可以用作匹配 -inputformat 的简写方式,现在需要使用 -in

                  自定义管理单元

                  PowerShell 管理单元是 PowerShell 模块的前身,但在 PowerShell 社区中并未得到广泛采用。

                  由于支持管理单元的复杂性以及社区中缺乏使用情况,我们不再支持 PowerShell 中的自定义管理单元。

                  实验性功能标志

                  PowerShell 6.2 启用了对实验功能的支持。这使得 PowerShell 开发人员能够在设计完成之前提供新功能并获得反馈。这样我们就可以避免随着设计的发展而做出重大改变。

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

                  在尝试从 GAC 加载之前,从模块基本路径加载程序集

                  以前,当二进制模块在 GAC 中具有模块程序集时,我们会先从 GAC 加载该程序集,然后再尝试从模块基本路径加载它。

                  跳过对具有值类型元素类型的集合的空元素检查

                  对于 Mandatory 参数以及 ValidateNotNullValidateNotNullOrEmpty 属性,如果集合的元素类型是值类型,则跳过空元素检查。

                  ParenExpressionSubExpressionArrayExpression 保留 $?

                  此 PR 改变了我们编译子管道 (...)、子表达式 $ (...) 和数组表达式 @() 的方式因此 $? 不会自动变为 true。相反,$? 的值取决于管道或执行语句的结果。

                  当本机命令写入 stderr 时,修复 $? 不为 $false

                  当本机命令写入 stderr 时,$? 未设置为 $false。本机命令通常会写入 stderr 而不打算指示失败。仅当本机命令具有非零退出代码时,$? 才设置为 $false

                  使 $ErrorActionPreference 不影响本机命令的 stderr 输出

                  本机命令通常会写入 stderr 而不打算指示失败。通过此更改,stderr 输出仍会在 ErrorRecord 对象中捕获,但如果 ErrorRecord 发生错误,运行时将不再应用 $ErrorActionPreference 来自本机命令。

                  更改 $OutputEncoding 以使用 UTF-8 NoBOM 编码而不是 ASCII

                  以前的编码 ASCII(7 位)在某些情况下会导致输出的错误更改。将 UTF-8 NoBOM 设置为默认值可使用大多数工具和操作系统支持的编码保留 Unicode 输出。

                  将带有参数 -Encoding 的 cmdlet 统一为 System.Text.Encoding 类型

                  -EncodingByte 已从文件系统提供程序 cmdlet 中删除。新参数 -AsByteStream 现在用于指定需要字节流作为输入或输出是字节流。

                  在非 Windows 平台上将 New-ModuleManifest 编码更改为 UTF8NoBOM

                  以前,New-ModuleManifest 使用 BOM 以 UTF-16 格式创建 psd1 清单,这给 Linux 工具带来了问题。此重大更改将非 Windows 平台中的 New-ModuleManifest 编码更改为 UTF(无 BOM)。

                  从大多数默认别名中删除 AllScope

                  为了加快作用域创建速度,AllScope 已从大多数默认别名中删除。 AllScope 留给了一些查找速度更快的常用别名。

                  -Verbose-Debug 不再覆盖 $ErrorActionPreference

                  以前,如果指定了 -Verbose-Debug,它会覆盖 $ErrorActionPreference 的行为。通过此更改,-Verbose-Debug 不再影响 $ErrorActionPreference 的行为。

                  此外,-Debug 参数将 $DebugPreference 设置为 Continue,而不是 Inquire

                  使 $PSCulture 始终反映会话中的文化变化

                  在 Windows PowerShell 中,当前区域性值会被缓存,这可能会导致该值与会话启动后区域性更改不同步。此缓存行为在 PowerShell 核心中已修复。

                  允许显式指定的命名参数取代哈希表展开中的相同参数

                  通过此更改,来自 splatting 的命名参数将移至参数列表的末尾,以便在绑定所有显式指定的命名参数后绑定它们。当找不到指定的命名参数时,简单函数的参数绑定不会引发错误。未知的命名参数绑定到简单函数的 $args 参数。将展开移动到参数列表的末尾会更改参数在 $args 中出现的顺序。

                  例如:

                  function SimpleTest {
                      param(
                          $Name,
                          $Path
                      )
                      "Name: $Name; Path: $Path; Args: $args"
                  }
                  

                  在前面的行为中,MyPath 未绑定到 -Path,因为它是参数列表中的第三个参数。 ## 所以它最终会和 Blah="World" 一起被塞进 '$args' 中

                  PS> $hash = @{ Name = "Hello"; Blah = "World" }
                  PS> SimpleTest @hash "MyPath"
                  Name: Hello; Path: ; Args: -Blah: World MyPath
                  

                  通过此更改,@hash 中的参数将移至参数列表的末尾。 MyPath 成为列表中的第一个参数,因此它绑定到 -Path

                  PS> SimpleTest @hash "MyPath"
                  Name: Hello; Path: MyPath; Args: -Blah: World
                  

                  语言变化

                  空合并运算符 ??

                  如果左侧操作数不为 null,则空合并运算符 ?? 返回其值。否则,它计算右侧操作数并返回其结果。如果左侧操作数的计算结果为非空,则 ?? 运算符不会计算其右侧操作数。

                  $x = $null
                  $x ?? 100
                  
                  100
                  

                  在以下示例中,不会计算右侧操作数。

                  [string] $todaysDate = '1/10/2020'
                  $todaysDate ?? (Get-Date).ToShortDateString()
                  
                  1/10/2020
                  

                  空合并赋值运算符 ??=

                  仅当左侧操作数的计算结果为 null 时,空合并赋值运算符 ??= 才会将右侧操作数的值分配给左侧操作数。如果左侧操作数的计算结果为非空,则 ??= 运算符不会计算其右侧操作数。

                  $x = $null
                  $x ??= 100
                  $x
                  
                  100
                  

                  在以下示例中,不会计算右侧操作数。

                  [string] $todaysDate = '1/10/2020'
                  $todaysDate ??= (Get-Date).ToShortDateString()
                  
                  1/10/2020
                  

                  空条件运算符

                  笔记

                  此功能在 PowerShell 7.1 中从实验性转变为主流。

                  仅当操作数的计算结果为非空时,空条件运算符才会对其操作数应用成员访问 (?.) 或元素访问 (?[]) 操作;否则,返回 null。

                  由于 PowerShell 允许 ? 成为变量名称的一部分,因此使用这些运算符需要正式指定变量名称。因此,需要在变量名称周围使用 {},例如 $ {a} 或当 ? 是变量名称的一部分$ {a?}。

                  在以下示例中,返回 PropName 的值。

                  $a = @{ PropName = 100 }
                  ${a}?.PropName
                  
                  100
                  

                  以下示例将返回 null,而不尝试访问成员名称 PropName

                  $a = $null
                  ${a}?.PropName
                  

                  同样,将返回该元素的值。

                  $a = 1..10
                  ${a}?[0]
                  
                  1
                  

                  当操作数为 null 时,不会访问该元素并返回 null。

                  $a = $null
                  ${a}?[0]
                  

                  笔记

                  $ {} 的变量名称语法不应与 $() 子表达式运算符混淆。有关详细信息,请参阅 about_Variables 的变量名称部分。

                  添加了用于作业控制的 & 运算符

                  & 放在管道末尾会导致管道作为 PowerShell 作业运行。当管道后台运行时,会返回一个作业对象。一旦管道作为作业运行,所有标准 *-Job cmdlet 都可用于管理作业。管道中使用的变量(忽略特定于流程的变量)会自动复制到作业中,因此 Copy-Item $foo $bar & 可以正常工作。该作业也在当前目录而不是用户的主目录中运行。

                  PSCustomObject 上的新方法/属性

                  我们向 PSCustomObject 添加了新的方法和属性。 PSCustomObject 现在像其他对象一样包含 Count/Length 属性。

                  $PSCustomObject = [pscustomobject]@{foo = 1}
                  
                  $PSCustomObject.Length
                  
                  1
                  
                  $PSCustomObject.Count
                  
                  1
                  

                  这项工作还包括 ForEachWhere 方法,允许您对 PSCustomObject 项进行操作和过滤:

                  $PSCustomObject.ForEach({$_.foo + 1})
                  
                  2
                  
                  $PSCustomObject.Where({$_.foo -gt 0})
                  
                  foo
                  ---
                    1
                  

                  从 PSMethod 到 Delegate 的转换

                  您可以将 PSMethod 转换为委托。这允许您执行诸如将 PSMethod [M]::DoubleStrLen 作为委托值传递到 [M]::AggregateString 之类的操作:

                  class M {
                      static [int] DoubleStrLen([string] $value) { return 2 * $value.Length }
                  
                      static [long] AggregateString([string[]] $values, [func[string, int]] $selector) {
                          [long] $res = 0
                          foreach($s in $values){
                              $res += $selector.Invoke($s)
                          }
                          return $res
                      }
                  }
                  
                  [M]::AggregateString((gci).Name, [M]::DoubleStrLen)
                  

                  PowerShell 7.1 中的字符串比较行为已更改

                  PowerShell 7.1 基于 .NET 5.0 构建,它引入了以下重大更改:

                  • 在 .NET 5+ 上比较字符串时的行为发生变化

                  从 .NET 5.0 开始,区域性不变字符串比较会忽略非打印控制字符。

                  例如,以下两个字符串被认为是相同的:

                  # Escape sequence "`a" is Ctrl-G or [char]7
                  'Food' -eq "Foo`ad"
                  
                  True
                  

                  新的 cmdlet

                  新的 Get-Uptime cmdlet

                  Get-Uptime cmdlet 返回自上次启动操作系统以来所经过的时间。该 cmdlet 是在 PowerShell 6.0 中引入的。

                  新的删除别名 cmdlet

                  Remove-Alias cmdlet 从当前 PowerShell 会话中删除别名。该 cmdlet 是在 PowerShell 6.0 中引入的。

                  新 cmdlet 删除服务

                  Remove-Service cmdlet 可删除注册表和服务数据库中的 Windows 服务。 Remove-Service cmdlet 是在 PowerShell 6.0 中引入的。

                  新的 Markdown cmdlet

                  Markdown 是一种创建可读纯文本文档的标准,其基本格式可以呈现为 HTML。

                  PowerShell 6.1 中添加了以下 cmdlet:

                  • ConvertFrom-Markdown - 将字符串或文件的内容转换为 MarkdownInfo 对象。
                  • Get-MarkdownOption - 返回用于在控制台中渲染 Markdown 内容的当前颜色和样式。
                  • Set-MarkdownOption - 设置用于在控制台中渲染 Markdown 内容的颜色和样式。
                  • Show-Markdown - 在控制台中显示 Markdown 内容或以 HTML 形式显示

                  新的 Test-Json cmdlet

                  Test-Json cmdlet 测试字符串是否是有效的 JavaScript 对象表示法 (JSON) 文档,并且可以选择根据提供的架构验证该 JSON 文档。

                  此 cmdlet 是在 PowerShell 6.1 中引入的

                  支持实验功能的新 cmdlet

                  PowerShell 6.2 中添加了以下 cmdlet 以支持实验功能。

                  • Disable-ExperimentalFeature
                  • Enable-ExperimentalFeature
                  • Get-ExperimentalFeature

                  新的 Join-String cmdlet

                  Join-String cmdlet 将管道中的对象组合成单个字符串。此 cmdlet 是在 PowerShell 6.2 中添加的。

                  新视图 ConciseView 和 cmdlet Get-Error

                  PowerShell 7.0 通过新的默认视图 ConciseView 增强了错误消息的显示,以提高交互和脚本错误的可读性。用户可以通过首选项变量$ErrorView来选择视图。

                  对于 ConciseView,如果错误不是来自脚本或解析器错误,那么它是单行错误消息:

                  Get-Childitem -Path c:\NotReal
                  
                  Get-ChildItem: Cannot find path 'C:\NotReal' because it does not exist
                  

                  如果错误发生在脚本执行期间或者是解析错误,PowerShell 将返回一条多行错误消息,其中包含错误、指针以及显示错误在该行中的位置的错误消息。如果终端不支持 ANSI 颜色转义序列 (VT100),则不会显示颜色。

                  PowerShell 7 中的默认视图是 ConciseView。以前的默认视图是 NormalView,您可以通过设置首选项变量 $ErrorView 来选择它。

                  $ErrorView = 'NormalView' # Sets the error view to NormalView
                  $ErrorView = 'ConciseView' # Sets the error view to ConciseView
                  

                  笔记

                  $Host.PrivateData 中添加了新属性 ErrorAccentColor,以支持更改错误消息的强调色。

                  新的 Get-Errorcmdlet 在需要时提供完全限定错误的完整详细视图。默认情况下,cmdlet 显示最后发生的错误的完整详细信息,包括内部异常。

                  Get-Error cmdlet 支持使用内置变量 $Error 从管道输入。 Get-Error 显示所有管道错误。

                  $Error | Get-Error
                  

                  Get-Error cmdlet 支持Newest 参数,允许您指定希望显示的当前会话中的错误数量。

                  Get-Error -Newest 3 # Displays the lst three errors that occurred in the session
                  

                  有关详细信息,请参阅获取错误。

                  Cmdlet 更改

                  ForEach-Object 添加并行执行

                  从 PowerShell 7.0 开始,用于迭代集合中的项目的 ForEach-Object cmdlet 现在通过新的 Parallel 参数具有内置并行性。

                  默认情况下,并行脚本块使用启动并行任务的调用者的当前工作目录。

                  此示例从本地 Windows 计算机上的 5 个系统日志中检索 50,000 个日志条目:

                  $logNames = 'Security','Application','System','Windows PowerShell','Microsoft-Windows-Store/Operational'
                  
                  $logEntries = $logNames | ForEach-Object -Parallel {
                      Get-WinEvent -LogName $_ -MaxEvents 10000
                  } -ThrottleLimit 5
                  
                  $logEntries.Count
                  
                  50000
                  

                  Parallel 参数指定为每个输入日志名称并行运行的脚本块。

                  新的 ThrottleLimit 参数限制给定时间并行运行的脚本块的数量。默认值为 5。

                  使用 $_ 变量表示脚本块中的当前输入对象。使用 $using: 作用域将变量引用传递给正在运行的脚本块。

                  有关详细信息,请参阅ForEach-Object。

                  检查 system32 Windows 上兼容的内置模块

                  在 Windows 10 1809 更新和 Windows Server 2019 中,我们更新了许多内置 PowerShell 模块,将它们标记为与 PowerShell 兼容。

                  当 PowerShell 启动时,它会自动包含 $windir\System32 作为 PSModulePath 环境变量的一部分。但是,如果其 CompatiblePSEdition 标记为与 Core 兼容,则它仅向 Get-ModuleImport-Module 公开模块>。

                  您可以使用 -SkipEditionCheck 开关参数覆盖此行为以显示所有模块。我们还在表输出中添加了一个 PSEdition 属性。

                  所有 -LiteralPath 参数的 -lp 别名

                  我们为所有具有 -LiteralPath 参数的内置 PowerShell cmdlet 创建了一个标准参数别名 -lp

                  如果 a*b 实际上不存在,则修复 Get-Item -LiteralPath a*b 返回错误

                  以前,给定通配符的 -LiteralPath 会将其视为与 -Path 相同,如果通配符找不到文件,它将静默退出。正确的行为应该是 -LiteralPath 是文字,因此如果文件不存在,则应该出错。更改是将与 -Literal 一起使用的通配符视为文字。

                  将工作目录设置为 Start-Job 中的当前目录

                  Start-Job cmdlet 现在使用当前目录作为新作业的工作目录。

                  *-Computer cmdlet 中删除 -Protocol

                  由于 CoreFX 中的 RPC 远程处理问题(特别是在非 Windows 平台上)以及确保 PowerShell 中一致的远程处理体验的问题,-Protocol 参数已从 \*-Computer中删除> cmdlet。远程处理不再支持 DCOM。以下 cmdlet 仅支持 WSMAN 远程处理:

                    Rename-Computer
                    Restart-Computer
                    Stop-Computer

                    *-Service cmdlet 中删除 -ComputerName

                    为了鼓励 PSRP 的一致使用,已从 *-Service cmdlet 中删除了 -ComputerName 参数。

                    修复 Get-Content -Delimiter 以不在返回的行中包含分隔符

                    以前,使用 Get-Content -Delimiter 时的输出不一致且不方便,因为它需要进一步处理数据以删除分隔符。此更改删除了返回行中的分隔符。

                    十六进制格式的更改

                    -Raw 参数现在是“无操作”(因为它不执行任何操作)。今后,所有输出均以数字的真实表示形式显示,其中包括其类型的所有字节。这就是 -Raw 参数在此更改之前所做的事情。

                    修复 Get-ComputerInfo 属性名称中的拼写错误

                    BiosSerialNumber 被错误地拼写为 BiosSeralNumber,已更改为正确的拼写。

                    添加 Get-StringHash 和 Get-FileHash cmdlet

                    此更改是 CoreFX 不支持某些哈希算法,因此它们不再可用:

                      MACTripleDES
                      RIPEMD160

                      Get-* cmdlet 上添加验证,其中传递 $null 返回所有对象而不是错误

                      现在将 $null 传递给以下任何一个都会引发错误:

                        Get-Credential -UserName
                        Get-Event -SourceIdentifier
                        Get-EventSubscriber -SourceIdentifier
                        Get-Help -Name
                        Get-PSBreakpoint -Script
                        Get-PSProvider -PSProvider
                        Get-PSSessionConfiguration -Name
                        Get-Runspace -Name
                        Get-RunspaceDebug -RunspaceName
                        Get-Service -Name
                        Get-TraceSource -Name
                        Get-Variable -Name

                        Import-Csv 中添加对 W3C 扩展日志文件格式的支持

                        以前,Import-Csv cmdlet 无法用于直接导入 W3C 扩展日志格式的日志文件,需要执行其他操作。通过此更改,支持 W3C 扩展日志格式。

                        当 CSV 中存在类型信息时,Import-Csv 在导入时应用 PSTypeNames

                        以前,使用 Export-CSV 导出并使用 ConvertFrom-Csv 导入 TypeInformation 的对象不会保留类型信息。此更改将类型信息添加到 PSTypeNames 成员(如果可从 CSV 文件获取)。

                        -NoTypeInformationExport-Csv 上的默认设置

                        以前,Export-CSV cmdlet 会将注释输出为包含对象类型名称的第一行。默认情况下,此更改会排除类型信息,因为大多数 CSV 工具无法理解它。进行此更改是为了解决客户反馈。

                        使用 -InincludeTypeInformation 保留以前的行为。

                        允许在 Remove-Item 的注册表路径中使用 *

                        以前,给定通配符的 -LiteralPath 会将其视为与 -Path 相同,如果通配符找不到文件,它将静默退出。正确的行为应该是 -LiteralPath 是文字,因此如果文件不存在,则应该出错。更改是将与 -Literal 一起使用的通配符视为文字。

                        组对象现在对组进行排序

                        作为性能改进的一部分,Group-Object 现在返回组的排序列表。尽管您不应该依赖顺序,但如果您想要第一组,您可能会被此更改破坏。我们认为这种性能改进是值得改变的,因为依赖以前的行为的影响很小。

                        测量对象中的标准偏差

                        Measure-Object 的输出现在包含一个 StandardDeviation 属性。

                        Get-Process | Measure-Object -Property CPU -AllStats
                        
                        Count             : 308
                        Average           : 31.3720576298701
                        Sum               : 9662.59375
                        Maximum           : 4416.046875
                        Minimum           :
                        StandardDeviation : 264.389544720926
                        Property          : CPU
                        

                        获取 PfxCertificate -密码

                        Get-PfxCertificate 现在具有 Password 参数,该参数采用 SecureString。这允许您以非交互方式使用它:

                        $certFile = '\server\share\pwd-protected.pfx'
                        $certPass = Read-Host -AsSecureString -Prompt 'Enter the password for certificate: '
                        
                        $certThumbPrint = (Get-PfxCertificate -FilePath $certFile -Password $certPass ).ThumbPrint
                        

                        删除 more 功能

                        过去,PowerShell 在 Windows 上提供了一个名为 more 的函数,该函数包装了 more.com。该功能现已被删除。

                        此外,help 函数更改为在 Windows 上使用 more.com,或在非 Windows 上使用 $env:PAGER 指定的系统默认寻呼机平台。

                        cd DriveName: 现在将用户返回到该驱动器中的当前工作目录

                        以前,使用 Set-Locationcd 返回 PSDrive 会将用户发送到该驱动器的默认位置。现在,用户将被发送到该会话的最后一个已知的当前工作目录。

                        cd - 返回上一个目录

                        C:\Windows\System32> cd C:\
                        C:\> cd -
                        C:\Windows\System32>
                        

                        或者在 Linux 上:

                        PS /etc> cd /usr/bin
                        PS /usr/bin> cd -
                        PS /etc>
                        

                        另外,cdcd -- 更改为 $HOME

                        以非管理员身份Update-Help

                        根据大众的需求,Update-Help 不再需要以管理员身份运行。 Update-Help 现在默认将帮助保存到用户范围的文件夹中。

                        Where-Object -Not

                        通过在 Where-Object 中添加 -Not 参数,可以过滤管道中的对象以查找不存在的属性或 null/空属性值。

                        例如,此命令返回未定义任何依赖服务的所有服务:

                        Get-Service | Where-Object -Not DependentServices
                        

                        Web Cmdlet 的更改

                        Web Cmdlet 的底层 .NET API 已更改为 System.Net.Http.HttpClient。这一变化带来了很多好处。但是,此更改以及与 Internet Explorer 互操作性的缺乏导致了 Invoke-WebRequestInvoke-RestMethod 中的一些重大更改。

                        • Invoke-WebRequest 现在仅支持基本的 HTML 解析。 Invoke-WebRequest 始终返回一个 BasicHtmlWebResponseObject 对象。 ParsedHtmlForms 属性已被删除。
                        • BasicHtmlWebResponseObject.Headers 值现在为 String[] 而不是 String
                        • BasicHtmlWebResponseObject.BaseResponse 现在是一个 System.Net.Http.HttpResponseMessage 对象。
                        • Web Cmdlet 异常的 Response 属性现在是 System.Net.Http.HttpResponseMessage 对象。
                        • 现在,严格的 RFC 标头解析是 -Headers-UserAgent 参数的默认设置。这可以通过 -SkipHeaderValidation 绕过。
                        • 不再支持 file://ftp:// URI 方案。
                        • 不再遵循 System.Net.ServicePointManager 设置。
                        • 目前 macOS 上没有可用的基于证书的身份验证。
                        • http:// URI 上使用 -Credential 将导致错误。使用 https:// URI 或提供 -AllowUnencryptedAuthentication 参数来抑制错误。
                        • 现在,当重定向尝试超出提供的限制时,-MaximumRedirection 会生成终止错误,而不是返回上次重定向的结果。
                        • 在 PowerShell 6.2 中,对 JSON 响应进行了更改,默认使用 UTF-8 编码。当未为 JSON 响应提供字符集时,默认编码应为符合 RFC 8259 的 UTF-8。
                        • application-json 响应的默认编码设置为 UTF-8
                        • 添加了 -SkipHeaderValidation 参数以允许不符合标准的 Content-Type 标头
                        • 添加了 -Form 参数以支持简化的 multipart/form-data 支持
                        • 关系键的兼容且不区分大小写的处理
                        • 为 Web cmdlet 添加了 -Resume 参数

                        Invoke-RestMethod 在没有返回数据时返回有用的信息

                        当 API 仅返回 null 时,Invoke-RestMethod 会将其序列化为字符串 "null" 而不是 $null >。此更改修复了 Invoke-RestMethod 中的逻辑,以将有效的单值 JSON null 文字正确序列化为 $null

                        当通过未加密的连接发送 -Credential 时,Web Cmdlet 会发出警告

                        使用 HTTP 时,包括密码在内的内容将以明文形式发送。此更改是默认情况下不允许这样做,并且如果凭据不安全地传递,则返回错误。用户可以使用 -AllowUnencryptedAuthentication 开关绕过此问题。

                        使 Web cmdlet 中的 -OutFile 参数像 -LiteralPath 一样工作

                        从 PowerShell 7.1 开始,Web cmdlet 的 OutFile 参数的工作方式与 LiteralPath 类似,并且不处理通配符。

                        API变更

                        删除 AddTypeCommandBase 类

                        Add-Type 中删除了 AddTypeCommandBase 类以提高性能。此类仅由 Add-Type cmdlet 使用,不应影响用户。

                        删除了 Add-Type 中支持的语言 VisualBasic

                        过去,您可以使用 Add-Type cmdlet 编译 Visual Basic 代码。 Visual Basic 很少与Add-Type 一起使用。我们删除了此功能以减小 PowerShell 的大小。

                        删除了 RunspaceConfiguration 支持

                        以前,当使用 API 以编程方式创建 PowerShell 运行空间时,您可以使用旧版 RunspaceConfiguration 或较新的 InitialSessionState 类。此更改删除了对 RunspaceConfiguration 的支持,仅支持 InitialSessionState

                        CommandInvocationIntrinsics.InvokeScript 将参数绑定到 $input 而不是 $args

                        参数位置不正确导致参数作为输入而不是作为参数传递。

                        $PSVersionTable 中删除 ClrVersionBuildVersion 属性

                        $PSVersionTableClrVersion 属性对于 CoreCLR 没有用处。最终用户不应使用该值来确定兼容性。

                        BuildVersion 属性与 Windows 构建版本相关,该版本在非 Windows 平台上不可用。使用 GitCommitId 属性检索 PowerShell 的确切构建版本。

                        实现Unicode转义解析

                        `u#### `u{####} 转换为相应的 Unicode 字符。要输出文字 `u,请转义反引号: ``u

                        PS 函数中 ValueFromRemainingArguments 的参数绑定问题

                        ValueFromRemainingArguments 现在以数组形式返回值,而不是本身就是数组的单个值。

                        清理了 CommandTypes.WorkflowWorkflowInfoCleaned 的使用

                        清理与 System.Management.Automation 中的 CommandTypes.WorkflowWorkflowInfo 使用相关的代码。

                        这些细微的重大更改主要影响帮助提供程序代码。

                        • WorkflowInfo 的公共构造函数更改为内部构造函数。我们不再支持工作流,因此不允许人们创建 Workflow 实例是有意义的。
                        • 删除类型 System.Management.Automation.DebugSource,因为它仅用于工作流调试。
                        • 从仅用于工作流调试的抽象类 Debugger 中删除 SetParent 的重载。
                        • 从派生类 RemotingJobDebugger 中删除相同的 SetParent 重载。

                        ScriptBlock 转换为委托时,不要将返回结果包装在 PSObject

                        ScriptBlock 转换为要在 C# 上下文中使用的委托类型时,将结果包装在 PSObject 中会带来不必要的麻烦:

                        • 当值转换为委托返回类型时,PSObject 本质上会被解包。因此不需要 PSObject
                        • 当委托返回类型为 object 时,它会被包装在 PSObject 中,从而很难在 C# 代码中使用。

                        进行此更改后,返回的对象是底层对象。

                        远程支持

                        在 Unix 平台上使用 WinRM 的 PowerShell 远程处理 (PSRP) 需要 NTLM/Negotiate 或基于 HTTPS 的基本身份验证。 macOS 上的 PSRP 仅支持通过 HTTPS 进行基本身份验证。非 Windows 平台不支持基于 Kerberos 的身份验证。

                        PowerShell 还支持所有平台(Windows、macOS 和 Linux)上通过 SSH 的 PowerShell 远程处理 (PSRP)。有关详细信息,请参阅 PowerShell 中的 SSH 远程处理。

                        PowerShell Direct for Containers 首先尝试使用 pwsh

                        PowerShell Direct 是 PowerShell 和 Hyper-V 的一项功能,允许您连接到 Hyper-V VM 或容器,而无需网络连接或其他远程管理服务。

                        过去,PowerShell Direct 使用容器上内置的 Windows PowerShell 实例进行连接。现在,PowerShell Direct 首先尝试使用 PATH 环境变量上任何可用的 pwsh.exe 进行连接。如果 pwsh.exe 不可用,PowerShell Direct 会转而使用 powershell.exe

                        Enable-PSRemoting 现在为预览版本创建单独的远程处理端点

                        Enable-PSRemoting 现在创建两个远程会话配置:

                        • 其中之一适用于 PowerShell 的主要版本。例如,PowerShell.6。跨次要版本更新时可以依赖此端点作为“系统范围”PowerShell 6 会话配置
                        • 一种特定于版本的会话配置,例如:PowerShell.6.1.0

                        如果您希望在同一台计算机上安装并访问多个 PowerShell 6 版本,此行为非常有用。

                        此外,PowerShell 预览版本现在在运行 Enable-PSRemoting cmdlet 后获得自己的远程会话配置:

                        C:\WINDOWS\system32> Enable-PSRemoting
                        

                        如果您之前没有设置 WinRM,您的输出可能会有所不同。

                        WinRM is already set up to receive requests on this computer.
                        WinRM is already set up for remote management on this computer.
                        

                        然后,您可以看到 PowerShell 6 预览版和稳定版以及每个特定版本的单独 PowerShell 会话配置。

                        Get-PSSessionConfiguration
                        
                        Name          : PowerShell.6.2-preview.1
                        PSVersion     : 6.2
                        StartupScript :
                        RunAsUser     :
                        Permission    : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed
                        
                        Name          : PowerShell.6-preview
                        PSVersion     : 6.2
                        StartupScript :
                        RunAsUser     :
                        Permission    : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed
                        
                        Name          : powershell.6
                        PSVersion     : 6.1
                        StartupScript :
                        RunAsUser     :
                        Permission    : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed
                        
                        Name          : powershell.6.1.0
                        PSVersion     : 6.1
                        StartupScript :
                        RunAsUser     :
                        Permission    : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed
                        

                        SSH 支持的 user@host:port 语法

                        SSH 客户端通常支持 user@host:port 格式的连接字符串。通过添加 SSH 作为 PowerShell 远程处理协议,我们添加了对此格式的连接字符串的支持:

                        Enter-PSSession -HostName [email protected]:2222

                        遥测只能通过环境变量禁用

                        PowerShell 启动时会向 Microsoft 发送基本遥测数据。这些数据包括操作系统名称、操作系统版本和 PowerShell 版本。这些数据使我们能够更好地了解 PowerShell 的使用环境,并使我们能够确定新功能和修复的优先级。

                        要选择退出此遥测,请将环境变量 POWERSHELL_TELEMETRY_OPTOUT 设置为 trueyes1。我们不再支持删除文件 DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY 来禁用遥测。

                        您需要 登录账户 后才能发表评论

                        取消回复欢迎 发表评论:

                        关灯