[玩转系统] 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-WinEvent
和 New-WinEvent
可用于在 Windows 上获取和创建事件。
使用 Windows 演示框架 (WPF) 的 Cmdlet
.NET Core 3.1 添加了对 WPF 的支持,因此 PowerShell 7.0 的发布恢复了以下 Windows 特定功能:
Show-Command
cmdletOut-GridView
cmdletGet-Help
的 ShowWindow 参数
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.exe
对 pwsh(.exe)
的其他更改:
- 将第一个位置参数从
-Command
更改为-File
。此更改修复了从非 Windows 平台上的非 PowerShell shell 执行的 PowerShell 脚本中使用#!
(又名 shebang)的问题。这还意味着您可以运行pwsh foo.ps1
或pwsh fooScript
等命令,而无需指定-File
。但是,此更改要求您在尝试运行pwsh.exe -Command Get-Command
等命令时显式指定-c
或-Command
。 pwsh
接受-i
(或-Interactive
)开关来指示交互式 shell。这允许 PowerShell 用作 Unix 平台上的默认 shell。- 从
pwsh.exe
中删除了参数-ImportSystemModules
和-PSConsoleFile
。 - 更改了
pwsh -version
和pwsh.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-ExperimentalFeature
和 Disable-ExperimentalFeature
启用或禁用这些功能。
在尝试从 GAC 加载之前,从模块基本路径加载程序集
以前,当二进制模块在 GAC 中具有模块程序集时,我们会先从 GAC 加载该程序集,然后再尝试从模块基本路径加载它。
跳过对具有值类型元素类型的集合的空元素检查
对于 Mandatory
参数以及 ValidateNotNull
和 ValidateNotNullOrEmpty
属性,如果集合的元素类型是值类型,则跳过空元素检查。
为 ParenExpression、SubExpression 和 ArrayExpression 保留 $?
此 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
类型
-Encoding
值 Byte
已从文件系统提供程序 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
这项工作还包括 ForEach
和 Where
方法,允许您对 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-Error
cmdlet 在需要时提供完全限定错误的完整详细视图。默认情况下,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-Module
和 Import-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 文件获取)。
-NoTypeInformation
是 Export-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-Location
或 cd
返回 PSDrive 会将用户发送到该驱动器的默认位置。现在,用户将被发送到该会话的最后一个已知的当前工作目录。
cd -
返回上一个目录
C:\Windows\System32> cd C:\
C:\> cd -
C:\Windows\System32>
或者在 Linux 上:
PS /etc> cd /usr/bin
PS /usr/bin> cd -
PS /etc>
另外,cd
和 cd --
更改为 $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-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 对象。
- 现在,严格的 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
中删除 ClrVersion
和 BuildVersion
属性
$PSVersionTable
的 ClrVersion
属性对于 CoreCLR 没有用处。最终用户不应使用该值来确定兼容性。
BuildVersion
属性与 Windows 构建版本相关,该版本在非 Windows 平台上不可用。使用 GitCommitId
属性检索 PowerShell 的确切构建版本。
实现Unicode转义解析
`u####
或 `u{####}
转换为相应的 Unicode 字符。要输出文字 `u
,请转义反引号: ``u
。
PS 函数中 ValueFromRemainingArguments
的参数绑定问题
ValueFromRemainingArguments
现在以数组形式返回值,而不是本身就是数组的单个值。
清理了 CommandTypes.Workflow
和 WorkflowInfoCleaned
的使用
清理与 System.Management.Automation 中的 CommandTypes.Workflow
和 WorkflowInfo
使用相关的代码。
这些细微的重大更改主要影响帮助提供程序代码。
- 将
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
设置为 true
、yes
或 1
。我们不再支持删除文件 DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY
来禁用遥测。
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag