- PowerShell 6.0 的重大更改Breaking Changes for PowerShell 6.0
- PowerShell Core 中不再可用的功能Features no longer available in PowerShell Core
- 引擎/语言更改Engine/language changes
- 将 powershell.exe 重命名为 pwsh.exe #5101Rename powershell.exe to pwsh.exe #5101
- 不要将换行符插入到输出(表除外)#5193Don't insert line breaks to output (except for tables) #5193
- 对具有值类型元素类型的集合,跳过 null 元素检查 #5432Skip null-element check for collections with a value-type element type #5432
- 更改 $OutputEncoding 以使用 UTF-8 NoBOM 编码,而不使用 ASCII #5369Change $OutputEncoding to use UTF-8 NoBOM encoding rather than ASCII #5369
- 从大多数默认别名中删除 AllScope #5268Remove AllScope from most default aliases #5268
- -Verbose 和 -Debug 不再替代 $ErrorActionPreference #5113-Verbose and -Debug no longer overrides $ErrorActionPreference #5113
- Cmdlet 更改Cmdlet changes
- 在没有返回任何数据时,Invoke-RestMethod 不返回有用的信息。Invoke-RestMethod doesn't return useful info when no data is returned. #5320#5320
- 从 -Computer cmdlet 中删除 -ComputerName #5277Remove -ComputerName from -Computer cmdlets #5277
- 从 -Service cmdlet 中删除 -ComputerName #5090Remove -ComputerName from -Service cmdlets #5090
- 如果 ab 实际上不存在,则修复 Get-Item -LiteralPath ab 以返回错误 #5197Fix Get-Item -LiteralPath ab if ab doesn't actually exist to return error #5197
- 当类型信息以 CSV 显示时,Import-Csv 应在导入时应用 PSTypeNames #5134Import-Csv should apply PSTypeNames upon import when type information is present in the CSV #5134
- -NoTypeInformation 在 Export-Csv 上应为默认设置 #5131-NoTypeInformation should be default on Export-Csv #5131
- 通过未加密的连接发送 -Credential 时,Web Cmdlet 应发出警告 #5112Web Cmdlets should warn when -Credential is sent over unencrypted connections #5112
- API 更改API changes
- 删除 AddTypeCommandBase 类 #5407Remove AddTypeCommandBase class #5407
- 将带有参数 -Encoding 的 cmdlet 统一为 System.Text.Encoding 类型 #5080Unify cmdlets with parameter -Encoding to be of type System.Text.Encoding #5080
- 为空和 null -UFormat 参数添加更好的错误消息 #5055Add better error message for empty and null -UFormat parameter #5055
- 清理控制台代码 #4995Clean up console code #4995
- 已删除 RunspaceConfiguration 支持 #4942Removed RunspaceConfiguration support #4942
- CommandInvocationIntrinsics.InvokeScript 将参数绑定到 $input 而不是 $args #4923CommandInvocationIntrinsics.InvokeScript bind arguments to $input instead of $args #4923
- 从 Get-Help 中删除不受支持的 -showwindow 开关 #4903Remove unsupported -showwindow switch from Get-Help #4903
- 允许为 Remove-Item 在注册表路径中使用 #4866Allow to be used in registry path for Remove-Item #4866
- 修复 Set-Service 失败测试 #4802Fix Set-Service failing test #4802
- 将 $IsOSX 重命名为 $IsMacOS #4700Rename $IsOSX to $IsMacOS #4700
- 在将无效脚本传递到 -File 时,使错误消息保持一致,在传递不确定的参数时提示更好的错误 #4573Make error message consistent when invalid script is passed to -File, better error when passed ambiguous argument #4573
- 从 Diagnostics 模块删除 LocalAccount 和 cmdlet。Removal of LocalAccount and cmdlets from Diagnostics modules. #4302 #4303#4302 #4303
- 使用 bool 参数执行 PowerShell 脚本不起作用 #4036Executing PowerShell script with bool parameter does not work #4036
- 从 $PSVersionTable 删除 ClrVersion 属性 #4027Remove ClrVersion property from $PSVersionTable #4027
- 将 powershell.exe 的位置参数从 -Command 更改为 -File #4019Change positional parameter for powershell.exe from -Command to -File #4019
- 实现 Unicode 转义分析 #3958Implement Unicode escape parsing #3958
- 在非 Windows 平台上将 New-ModuleManifest 编码更改为 UTF8NoBOM #3940Change New-ModuleManifest encoding to UTF8NoBOM on non-Windows platforms #3940
- 防止 Get-ChildItem 递归到符号链接中 (#1875)。Prevent Get-ChildItem from recursing into symlinks (#1875). #3780#3780
- 修复 Get-Content -Delimiter 以便不在返回的行中包含分隔符 #3706Fix Get-Content -Delimiter to not include the delimiter in the returned lines #3706
- 使用 C# 实现 Format-Hex #3320Implement Format-Hex in C# #3320
- 作为默认 shell 的 PowerShell 对脚本命令不起作用 #3319PowerShell as a default shell doesn't work with script command #3319
- Get-ComputerInfo 属性名中的拼写错误修复 #3167Typo fix in Get-ComputerInfo property name #3167
- 添加 Get-StringHash 和 Get-FileHash cmdlet #3024Add Get-StringHash and Get-FileHash cmdlets #3024
- 在传递 $null 返回所有对象而不是错误时在 Get- cmdlet 上添加验证 #2672Add validation on Get- cmdlets where passing $null returns all objects instead of error #2672
- 在 Import-Csv 中添加支持 W3C 扩展日志文件格式 #2482Add support W3C Extended Log File Format in Import-Csv #2482
- PS 函数中 ValueFromRemainingArguments 的参数绑定问题 #2035Parameter binding problem with ValueFromRemainingArguments in PS functions #2035
- 从 $PSVersionTable 中删除 BuildVersion #1415BuildVersion is removed from $PSVersionTable #1415
- 对 Web Cmdlet 的更改Changes to Web Cmdlets
PowerShell 6.0 的重大更改Breaking Changes for PowerShell 6.0
本文内容
PowerShell Core 中不再可用的功能Features no longer available in PowerShell Core
PowerShell 工作流PowerShell Workflow
PowerShell 工作流是基于可为长时间运行或并行化任务创建可靠 runbook 的 Windows Workflow Foundation (WF) 生成的 Windows PowerShell 中的一项功能。
由于缺少对 .NET Core 中的 Windows Workflow Foundation 的支持,我们将不继续在 PowerShell Core 中支持 PowerShell 工作流。
将来,我们希望使用 PowerShell 语言启用本机并行/并发,而无需使用 PowerShell 工作流。
自定义管理单元Custom snap-ins
PowerShell 管理单元是 PowerShell 社区中未广泛采用的 PowerShell 模块的前身。
鉴于支持管理单元的复杂性及其缺乏在社区中的使用,我们不再支持 PowerShell Core 中的自定义管理单元。
现在,这将中断 Windows 和 Windows Server 中的 ActiveDirectory
和 DnsClient
模块。
WMI v1 cmdletWMI v1 cmdlets
鉴于支持两个基于 WMI 的模块集的复杂性,我们从 PowerShell Core 中删除 WMI v1 cmdlet:
Get-WmiObject
Invoke-WmiMethod
Register-WmiEvent
Set-WmiInstance
我们转为建议使用 CIM(也称为 WMI v2)cmdlet,它们提供了与新功能及经过重新设计的语法相同的功能:Get-CimAssociatedInstance
Get-CimClass
Get-CimInstance
Get-CimSession
Invoke-CimMethod
New-CimInstance
New-CimSession
New-CimSessionOption
Register-CimIndicationEvent
Remove-CimInstance
Remove-CimSession
Set-CimInstance
Microsoft.PowerShell.LocalAccountsMicrosoft.PowerShell.LocalAccounts
由于使用了不受支持的 API 而从 PowerShell Core 中删除 Microsoft.PowerShell.LocalAccounts
,直至找到更佳解决方案。
-Counter cmdlet-Counter cmdlets
由于使用了不受支持的 API 而从 PowerShell Core 中删除 *-Counter
,直至找到更佳解决方案。
-EventLog cmdlet-EventLog cmdlets
由于使用了不受支持的 API 而从 PowerShell Core 中了删除 *-EventLog
。直到找到更佳解决方案。Get-WinEvent
和 Create-WinEvent
可用于在 Windows 上获取和创建事件。
引擎/语言更改Engine/language changes
将 powershell.exe 重命名为 pwsh.exe #5101Rename powershell.exe to pwsh.exe #5101
为了向用户提供在 Windows 上调用 PowerShell Core(而不是 Windows PowerShell)的确定方法,PowerShell Core 二进制文件在 Windows 上已更改为 pwsh.exe
,在非 Windows 平台上已更改为 pwsh
。
缩短的名称也与非 Windows 平台上 shell 的命名一致。
不要将换行符插入到输出(表除外)#5193Don't insert line breaks to output (except for tables) #5193
以前,输出与控制台的宽度对齐,并且在控制台的端宽度添加换行符,这意味着如果重新设置终端的大小,输出不会按预期重格式化。这一更改不适用于表格,因为换行符是保持列对齐所必需的。
对具有值类型元素类型的集合,跳过 null 元素检查 #5432Skip null-element check for collections with a value-type element type #5432
对于 Mandatory
参数及 ValidateNotNull
和 ValidateNotNullOrEmpty
属性,如果集合的元素类型是值类型,则跳过 null 元素检查。
更改 $OutputEncoding 以使用 UTF-8 NoBOM 编码,而不使用 ASCII #5369Change $OutputEncoding to use UTF-8 NoBOM encoding rather than ASCII #5369
以前的编码 ASCII(7 位)在某些情况下会导致输出的错误更改。此更改将使 UTF-8 NoBOM
成为默认设置,从而保留具有大多数工具和操作系统支持的编码的 Unicode 输出。
从大多数默认别名中删除 AllScope #5268Remove AllScope from most default aliases #5268
为了加快作用域创建,从大多数默认别名中删除了 AllScope
。保留 AllScope
供查找速度更快的几个常用别名使用。
-Verbose 和 -Debug 不再替代 $ErrorActionPreference #5113-Verbose and -Debug no longer overrides $ErrorActionPreference #5113
以前,如果已指定 -Verbose
或 -Debug
,则它会替代 $ErrorActionPreference
的行为。进行此更改后,-Verbose
和 -Debug
不再影响 $ErrorActionPreference
的行为。
Cmdlet 更改Cmdlet changes
在没有返回任何数据时,Invoke-RestMethod 不返回有用的信息。Invoke-RestMethod doesn't return useful info when no data is returned. #5320#5320
当 API 仅返回 null
时,Invoke-RestMethod 将其序列化为字符串 "null"
,而不是 $null
。此项更改修复了 Invoke-RestMethod
中的逻辑,以便将有效的单个值 JSON null
文本正确序列化为 $null
。
从 -Computer cmdlet 中删除 -ComputerName #5277Remove -ComputerName from -Computer cmdlets #5277
由于 CoreFX 中的 RPC 远程处理出现问题(特别是在非 Windows 平台上)以及为确保在 PowerShell 中获得一致的远程处理体验,已将 -ComputerName
参数从 *-Computer
cmdlet 中删除。改为使用 Invoke-Command
作为远程执行 cmdlet 的方法。
从 -Service cmdlet 中删除 -ComputerName #5090Remove -ComputerName from -Service cmdlets #5090
为了鼓励一致地使用 PSRP,已将 -ComputerName
参数从 *-Service
cmdlet 中删除。
如果 ab 实际上不存在,则修复 Get-Item -LiteralPath ab 以返回错误 #5197Fix Get-Item -LiteralPath ab if ab doesn't actually exist to return error #5197
以前,给定通配符的 -LiteralPath
将其视为与 -Path
相同,如果该通配符未找到任何文件,则会以无提示方式退出。正确的行为应该是 -LiteralPath
是文本,因此,如果文件不存在,它应显示错误。更改就是将与 -Literal
一起使用的通配符视作文本。
当类型信息以 CSV 显示时,Import-Csv 应在导入时应用 PSTypeNames #5134Import-Csv should apply PSTypeNames upon import when type information is present in the CSV #5134
以前,使用 Export-CSV
导出的对象(带有使用 ConvertFrom-Csv
导入的 TypeInformation
)已不保留类型信息。此更改会将类型信息添加到 PSTypeNames
成员(若可从 CSV 文件中获得)。
-NoTypeInformation 在 Export-Csv 上应为默认设置 #5131-NoTypeInformation should be default on Export-Csv #5131
此更改旨在解决客户对 Export-CSV
的默认行为的反馈,以包括类型信息。
以前,该 cmdlet 将输出一条注释作为包含对象的类型名称的第一行。此更改是为了默认取消此行为,因为大多数工具不理解该行为。使用 -IncludeTypeInformation
以保留以前的行为。
通过未加密的连接发送 -Credential 时,Web Cmdlet 应发出警告 #5112Web Cmdlets should warn when -Credential is sent over unencrypted connections #5112
使用 HTTP 时,包括密码在内的内容将以明文形式发送。此更改默认不允许此操作,并且如果以不安全的方式传递凭据,则返回错误。用户可以使用 -AllowUnencryptedAuthentication
开关来绕过此操作。
API 更改API changes
删除 AddTypeCommandBase 类 #5407Remove AddTypeCommandBase class #5407
从 Add-Type
删除 AddTypeCommandBase
类以提高性能。此类仅供 Add-Type cmdlet 使用,不应影响用户。
将带有参数 -Encoding 的 cmdlet 统一为 System.Text.Encoding 类型 #5080Unify cmdlets with parameter -Encoding to be of type System.Text.Encoding #5080
-Encoding
值 Byte
已从文件系统提供程序 cmdlet 中删除。新参数 -AsByteStream
现可用于指定需要一个字节流作为输入,或用于指定输出是一个字节流。
为空和 null -UFormat 参数添加更好的错误消息 #5055Add better error message for empty and null -UFormat parameter #5055
以前,在将空格式字符串传递到 -UFormat
时,会出现毫无用处的错误消息。已添加一个更具描述性的错误。
清理控制台代码 #4995Clean up console code #4995
已删除以下功能,因为它们在 PowerShell Core 中不受支持,也没有计划添加支持,因为它们出于适用于 Windows PowerShell 旧版的原因而存在:-psconsolefile
开关和代码、-importsystemmodules
开关和代码以及字体更改代码。
已删除 RunspaceConfiguration 支持 #4942Removed RunspaceConfiguration support #4942
以前,在使用 API 以编程方式创建 PowerShell 运行空间时,可以使用旧版 RunspaceConfiguration
或较新的 InitialSessionState
。此更改不再支持 RunspaceConfiguration
并仅支持 InitialSessionState
。
CommandInvocationIntrinsics.InvokeScript 将参数绑定到 $input 而不是 $args #4923CommandInvocationIntrinsics.InvokeScript bind arguments to $input instead of $args #4923
形参的位置不正确会导致将实参作为输入而不是实参进行传递。
从 Get-Help 中删除不受支持的 -showwindow 开关 #4903Remove unsupported -showwindow switch from Get-Help #4903
-showwindow
依赖于 WPF,这在 CoreCLR 上不受支持。
允许为 Remove-Item 在注册表路径中使用 #4866Allow to be used in registry path for Remove-Item #4866
以前,给定通配符的 -LiteralPath
将其视为与 -Path
相同,如果该通配符未找到任何文件,则会以无提示方式退出。正确的行为应该是 -LiteralPath
是文本,因此,如果文件不存在,它应显示错误。更改就是将与 -Literal
一起使用的通配符视作文本。
修复 Set-Service 失败测试 #4802Fix Set-Service failing test #4802
以前,如果使用了 New-Service -StartupType foo
,则忽略 foo
,并使用一些默认的启动类型创建服务。此更改是以显式方式来为无效启动类型引发错误。
将 $IsOSX 重命名为 $IsMacOS #4700Rename $IsOSX to $IsMacOS #4700
PowerShell 中的命名应与我们的命名保持一致,并符合 Apple 对 macOS 而不是 OSX 的使用。但是,出于可读性考虑,我们一直保持 Pascal 大小写格式。
在将无效脚本传递到 -File 时,使错误消息保持一致,在传递不确定的参数时提示更好的错误 #4573Make error message consistent when invalid script is passed to -File, better error when passed ambiguous argument #4573
更改 pwsh.exe
的退出代码以与 Unix 约定保持一致
从 Diagnostics 模块删除 LocalAccount 和 cmdlet。Removal of LocalAccount and cmdlets from Diagnostics modules. #4302 #4303#4302 #4303
由于不受支持的 API,会删除 LocalAccounts
模块和 Diagnostics
模块中的 Counter
cmdlet,直到找到更好的解决方案。
使用 bool 参数执行 PowerShell 脚本不起作用 #4036Executing PowerShell script with bool parameter does not work #4036
以前,使用 powershell.exe(现在使用 pwsh.exe)执行 PowerShell 脚本,使用 -File
无法将 $true
/$false
作为参数值进行传递。添加了支持将 $true
/$false
作为参数的解析值。由于当前记录的语法不起作用,也支持开关值。
从 $PSVersionTable 删除 ClrVersion 属性 #4027Remove ClrVersion property from $PSVersionTable #4027
$PSVersionTable
的 ClrVersion
属性对 CoreCLR 用处不大,最终用户不应使用该值来确定兼容性。
将 powershell.exe 的位置参数从 -Command 更改为 -File #4019Change positional parameter for powershell.exe from -Command to -File #4019
在非 Windows 平台上启用 PowerShell 的整个使用。这意味着,在基于 Unix 的系统上,可以创建脚本可执行文件,以自动调用 PowerShell 而不是显式调用 pwsh
。这也意味着,现在可以执行诸如 powershell foo.ps1
或 powershell fooScript
的操作,而无需指定 -File
。但是,此更改现在要求在尝试执行诸如 powershell.exe Get-Command
的操作时,显式指定 -c
或 -Command
。
实现 Unicode 转义分析 #3958Implement Unicode escape parsing #3958
将
转换为相应的 Unicode 字符。若要输出文本 u####</code> 或 <code>
u{####}`u
,转义反引号:``u
。
在非 Windows 平台上将 New-ModuleManifest 编码更改为 UTF8NoBOM #3940Change New-ModuleManifest encoding to UTF8NoBOM on non-Windows platforms #3940
以前,New-ModuleManifest
创建带有 BOM 的 UTF-16 格式的 psd1 清单,这为 Linux 工具带来了一个问题。这一重大更改将 New-ModuleManifest
的编码更改为非 Windows 平台中的 UTF(无 BOM)。
防止 Get-ChildItem 递归到符号链接中 (#1875)。Prevent Get-ChildItem from recursing into symlinks (#1875). #3780#3780
此更改使 Get-ChildItem
更符合 Unix ls -r
和 Windows dir /s
本机命令。如上述命令一样,该 cmdlet 显示在递归期间找到的目录的符号链接,但不会递归到它们中。
修复 Get-Content -Delimiter 以便不在返回的行中包含分隔符 #3706Fix Get-Content -Delimiter to not include the delimiter in the returned lines #3706
以前,使用 Get-Content -Delimiter
时的输出不一致且不方便,因为它需要进一步处理数据才能删除分隔符。此更改删除返回行中的分隔符。
使用 C# 实现 Format-Hex #3320Implement Format-Hex in C# #3320
-Raw
参数现在是一个“no-op”(因为它不执行任何操作)。今后,所有输出将显示数字的真实表示,其中包含其类型的所有字节(-Raw
参数在执行此更改之前正式执行的操作)。
作为默认 shell 的 PowerShell 对脚本命令不起作用 #3319PowerShell as a default shell doesn't work with script command #3319
在 Unix 上,对于交互式 shell 而言,shell 通常会接受 -i
,许多工具都期待这一行为(例如,script
,以及在将 PowerShell 设置为默认 shell 时),并使用 -i
开关来调用 shell。此更改具有突破性,因为 -i
以前可用作速记以匹配 -inputformat
,它现在需要使用 -in
。
Get-ComputerInfo 属性名中的拼写错误修复 #3167Typo fix in Get-ComputerInfo property name #3167
BiosSerialNumber
被错误地拼写为 BiosSeralNumber
,并被更改为正确的拼写。
添加 Get-StringHash 和 Get-FileHash cmdlet #3024Add Get-StringHash and Get-FileHash cmdlets #3024
此更改是 CoreFX 不支持的一些哈希算法,因此它们将不再可用:
MACTripleDES
RIPEMD160
在传递 $null 返回所有对象而不是错误时在 Get- cmdlet 上添加验证 #2672Add validation on Get- cmdlets where passing $null returns all objects instead of error #2672
将 $null
传递给以下任何项,现在会引发错误:
Get-Credential -UserName
Get-Event -SourceIdentifier
Get-EventSubscriber -SourceIdentifier
Get-Help -Name
Get-PSBreakpoint -Script
Get-PSProvider -PSProvider
Get-PSSessionConfiguration -Name
Get-PSSnapin -Name
Get-Runspace -Name
Get-RunspaceDebug -RunspaceName
Get-Service -Name
Get-TraceSource -Name
Get-Variable -Name
Get-WmiObject -Class
Get-WmiObject -Property
在 Import-Csv 中添加支持 W3C 扩展日志文件格式 #2482Add support W3C Extended Log File Format in Import-Csv #2482
以前,Import-Csv
cmdlet 不能用于直接导入采用 W3C 扩展日志格式的日志文件,并且需要执行其他操作。进行此更改后,支持 W3C 扩展日志格式。
PS 函数中 ValueFromRemainingArguments 的参数绑定问题 #2035Parameter binding problem with ValueFromRemainingArguments in PS functions #2035
ValueFromRemainingArguments
现在返回一些值作为数组,而不是本身是数组的单个值。
从 $PSVersionTable 中删除 BuildVersion #1415BuildVersion is removed from $PSVersionTable #1415
从 $PSVersionTable
中删除 BuildVersion
属性。此属性与 Windows 内部版本相关。我们建议使用 GitCommitId
检索 PowerShell Core 的确切内部版本。
对 Web Cmdlet 的更改Changes to Web Cmdlets
Web Cmdlet 的基础 .NET API 已更改为 System.Net.Http.HttpClient
。此更改提供了许多好处。但是,此更改以及缺乏与 Internet Explorer 的互操作性导致了 Invoke-WebRequest
和 Invoke-RestMethod
中的几次重大更改。
Invoke-WebRequest
现在仅支持基本 HTML 分析。Invoke-WebRequest
始终返回一个BasicHtmlWebResponseObject
对象。已删除ParsedHtml
和Forms
属性。BasicHtmlWebResponseObject.Headers
值现在是String[]
而不是String
。BasicHtmlWebResponseObject.BaseResponse
现在是一个System.Net.Http.HttpResponseMessage
对象。- Web Cmdlet 异常上的
Response
属性现在是一个System.Net.Http.HttpResponseMessage
对象。 - 对于
-Headers
和-UserAgent
参数,严格的 RFC 标头分析是默认设置。这可以使用-SkipHeaderValidation
绕过。 - 不再支持
file://
和ftp://
URI 方案。 - 不再采用
System.Net.ServicePointManager
设置。 - 目前在 macOS 上尚无基于证书的身份验证。
- 通过
http://
URI 使用-Credential
将导致错误。使用https://
URI 或提供-AllowUnencryptedAuthentication
参数来阻止此错误。 - 现在当重定向尝试超过提供的限制时,
-MaximumRedirection
会生成终止错误时,而不是返回最后一次重定向的结果。