PowerShell Core 6.1 中的新增内容What's New in PowerShell Core 6.1
此外还有使 PowerShell 更快更稳定的“无数”“无聊的东西”(以及很多 bug 修复)!若要获取更改的完整列表,请查看我们 GitHub 上的更改日志。
尽管我们在下面公布了一些名字,但是同样感谢实现此版本的。
在于 5 月发布后,PowerShell Core 6.1 已移动至 .NET Core 2.1,从而对 PowerShell 进行了很多改进,其中包括:
- 性能改进(参见)
- Alpine Linux 支持(预览版)
- .NET 全局工具支持 - 即将在 PowerShell 中推出
.NET Core 的 Windows 兼容包Windows Compatibility Pack for .NET Core
在 Windows 上,.NET 团队发布了 ,这是一组程序集,可将大量已删除的 API 重新添加至 Windows 上的 .NET Core。
我们已将 Windows 兼容包添加到 PowerShell Core 6.1 版本中,让使用这些 API 的任何模块或脚本都能处于可用状态。
Windows兼容包使 PowerShell Core 能使用 Windows 10 2018 年 10 月更新和 Windows Server 2019 附带的 1900 多个 cmdlet。
对应用程序允许列表的支持Support for Application Whitelisting
PowerShell Core 6.1 与支持 和 Device Guard 应用程序允许列表的 Windows PowerShell 5.1 具有奇偶一致性。根据应用程序允许列表,可使用 PowerShell 精确地控制允许执行的二进制文件。
性能改进Performance improvements
PowerShell Core 6.0 取得了一些显着的性能提升。PowerShell Core 6.1 持续提高部分操作的速度。
例如,Group-Object
的速度提高了 66%:
Measure-Command { 1..100000 | % {Get-Random -Minimum 1 -Maximum 10000} | Group-Object }
同样,像这样的排序方案提高了 15% 以上:
Measure-Command { 1..100000 | % {Get-Random -Minimum 1 -Maximum 10000} | Sort-Object }
在从 Windows PowerShell 回归后,Import-Csv
的速度也显著提升了。以下示例使用具有 26,616 行和 6 列的测试 CSV:
Measure-Command {$a = Import-Csv foo.csv}
最后,使用 Windows PowerShell,从 JSON 到 PSObject
的转换速度提高了 50% 以上。以下示例使用大约 2MB 的测试 JSON 文件:
Measure-Command {Get-Content .\foo.json | ConvertFrom-Json}
在 Windows 10 1809 更新和 Windows Server 2019 中,我们更新了许多内置 PowerShell 模块,将其标记为与 PowerShell Core 兼容。
当 PowerShell Core 6.1 启动时,它会自动将 $windir\System32
包含为 PSModulePath
环境变量的一部分。但是,如果模块 CompatiblePSEdition
被标记为与 Core
兼容,则它仅将模块公开给 Get-Module
和 Import-Module
。
Get-Module -ListAvailable
备注
可能会看到不同的可用模块,具体取决于安装的角色和功能。
...
Directory: C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
ModuleType Version Name PSEdition ExportedCommands
---------- ------- ---- --------- ----------------
Manifest 2.0.1.0 Appx Core,Desk {Add-AppxPackage, Get-AppxPackage, Get-AppxPacka...
Manifest 1.0.0.0 BitLocker Core,Desk {Unlock-BitLocker, Suspend-BitLocker, Resume-Bit...
Manifest 1.0.0.0 DnsClient Core,Desk {Resolve-DnsName, Clear-DnsClientCache, Get-DnsC...
Manifest 1.0.0.0 HgsDiagnostics Core,Desk {New-HgsTraceTarget, Get-HgsTrace, Get-HgsTraceF...
Binary 2.0.0.0 Hyper-V Core,Desk {Add-VMAssignableDevice, Add-VMDvdDrive, Add-VMF...
Binary 1.1 Hyper-V Core,Desk {Add-VMDvdDrive, Add-VMFibreChannelHba, Add-VMHa...
Manifest 2.0.0.0 NetAdapter Core,Desk {Disable-NetAdapter, Disable-NetAdapterBinding, ...
Manifest 1.0.0.0 NetEventPacketCapture Core,Desk {New-NetEventSession, Remove-NetEventSession, Ge...
Manifest 2.0.0.0 NetLbfo Core,Desk {Add-NetLbfoTeamMember, Add-NetLbfoTeamNic, Get-...
Manifest 1.0.0.0 NetNat Core,Desk {Get-NetNat, Get-NetNatExternalAddress, Get-NetN...
Manifest 2.0.0.0 NetQos Core,Desk {Get-NetQosPolicy, Set-NetQosPolicy, Remove-NetQ...
Manifest 2.0.0.0 NetSecurity Core,Desk {Get-DAPolicyChange, New-NetIPsecAuthProposal, N...
Manifest 1.0.0.0 NetSwitchTeam Core,Desk {New-NetSwitchTeam, Remove-NetSwitchTeam, Get-Ne...
Manifest 1.0.0.0 NetWNV Core,Desk {Get-NetVirtualizationProviderAddress, Get-NetVi...
Manifest 2.0.0.0 TrustedPlatformModule Core,Desk {Get-Tpm, Initialize-Tpm, Clear-Tpm, Unblock-Tpm...
...
可以替代此行为,使用 -SkipEditionCheck
开关参数显示所有模块。我们还在表输出中添加了 PSEdition
属性。
Get-Module Net* -ListAvailable -SkipEditionCheck
Directory: C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
ModuleType Version Name PSEdition ExportedCommands
Manifest 2.0.0.0 NetAdapter Core,Desk {Disable-NetAdapter, Disable-NetAdapterBinding, ...
Manifest 1.0.0.0 NetConnection Core,Desk {Get-NetConnectionProfile, Set-NetConnectionProf...
Manifest 1.0.0.0 NetDiagnostics Desk Get-NetView
Manifest 1.0.0.0 NetEventPacketCapture Core,Desk {New-NetEventSession, Remove-NetEventSession, Ge...
Manifest 2.0.0.0 NetLbfo Core,Desk {Add-NetLbfoTeamMember, Add-NetLbfoTeamNic, Get-...
Manifest 1.0.0.0 NetNat Core,Desk {Get-NetNat, Get-NetNatExternalAddress, Get-NetN...
Manifest 2.0.0.0 NetQos Core,Desk {Get-NetQosPolicy, Set-NetQosPolicy, Remove-NetQ...
Manifest 2.0.0.0 NetSecurity Core,Desk {Get-DAPolicyChange, New-NetIPsecAuthProposal, N...
Manifest 1.0.0.0 NetSwitchTeam Core,Desk {New-NetSwitchTeam, Remove-NetSwitchTeam, Get-Ne...
Manifest 1.0.0.0 NetTCPIP Core,Desk {Get-NetIPAddress, Get-NetIPInterface, Get-NetIP...
Manifest 1.0.0.0 NetWNV Core,Desk {Get-NetVirtualizationProviderAddress, Get-NetVi...
Manifest 1.0.0.0 NetworkConnectivityStatus Core,Desk {Get-DAConnectionStatus, Get-NCSIPolicyConfigura...
Manifest 1.0.0.0 NetworkSwitchManager Core,Desk {Disable-NetworkSwitchEthernetPort, Enable-Netwo...
Manifest 1.0.0.0 NetworkTransition Core,Desk {Add-NetIPHttpsCertBinding, Disable-NetDnsTransi...
有关此行为的更多信息,请查看 。
Markdown cmdlet 和呈现Markdown cmdlets and rendering
Markdown 是创建可读明文文档的标准,其基本格式可以呈现为 HTML。
我们在 6.1 中添加了一些 cmdlet,允许在控制台中转换和呈现 Markdown 文档,包括:
ConvertFrom-Markdown
Get-MarkdownOption
Set-MarkdownOption
Show-Markdown
例如,Show-Markdown
在控制台中呈现 Markdown 文件:
若要详细了解这些 cmdlet 的工作方式,请查看。
实验性功能标志Experimental feature flags
可以在 中了解有关此功能的更多信息。
Web cmdlet 的改进Web cmdlet improvements
感谢 ,我们对 Web cmdlet 进行了一系列改进:Invoke-WebRequest
和 。
- PR #6109 - 对于
application-json
响应,默认编码设置为 UTF-8 - -
-SkipHeaderValidation
参数允许不符合标准的Content-Type
标头 - PR #5972 -
Form
参数支持简化的multipart/form-data
支持 - - 合规且不区分大小写的关系键处理
- PR #6447 -添加 Web cmdlet 的
-Resume
参数
适用于容器的 PowerShell Direct 尝试先使用 PowerShell CorePowerShell Direct for Containers tries to use PowerShell Core first
PowerShell Direct 是 PowerShell 和 Hyper-V 的一项功能,允许在没有网络连接或其他远程管理服务的情况下连接到 Hyper-V VM 或容器。
在过去,PowerShell Direct 使用容器上的收件箱 Windows PowerShell 实例进行连接。现在,PowerShell Direct 先尝试使用 PATH
环境变量上任何可用的 进行连接。如果 pwsh.exe
不可用,PowerShell Direct 则会回退为使用 powershell.exe
。
Enable-PSRemoting 现在为预览版本创建单独的远程处理终结点Enable-PSRemoting now creates separate remoting endpoints for preview versions
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 会话配置。
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:port 语法user@host:port syntax supported for SSH
SSH 客户端通常支持格式为 user:port
的连接字符串。我们通过将 SSH 添加为 PowerShell 远程处理的协议,增加了对这种连接字符串格式的支持:
Enter-PSSession -HostName fooUser@ssh.contoso.com:2222
用于在 Windows 上添加资源管理器 shell 上下文菜单的 MSI 选项MSI option to add explorer shell context menu on Windows
感谢 @bergmeister 的帮助,现在可以在 Windows 上启用上下文菜单。现在,可以从 Windows 资源管理器中的任何文件夹打开系统范围的 PowerShell 6.1 安装:
超值服务Goodies
Windows 快捷方式跳转列表中的“以管理员身份运行”"Run as Administrator" in the Windows shortcut jump list
感谢 的帮助,PowerShell Core 快捷方式的跳转列表现已包含“以管理员身份运行”:
cd - 返回到上一目录cd - returns to previous directory
C:\Windows\System32> cd C:\
C:\> cd -
C:\Windows\System32>
或者,在 Linux 上:
PS /etc> cd /usr/bin
PS /usr/bin> cd -
cd
和 cd —
也更改为 $HOME
。
Test-Connection
感谢 @iSazonov 的帮助, cmdlet 已移植到 PowerShell Core。
根据大众需求,Update-Help
不再需要以管理员身份运行。Update-Help
现在默认将帮助保存到用户范围的文件夹。
PSCustomObject 上的新方法/属性New methods/properties on 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})
1
Where-Object -Not
感谢 @SimonWahlin 的帮助,我们已将 -Not
参数添加到 Where-Object
。现在可在管道中筛选对象,查看是否有不存在的属性或 null/空属性值。
Get-Service | Where-Object -Not DependentServices
New-ModuleManifest 创建无 BOM 的 UTF-8 文档New-ModuleManifest creates a BOM-less UTF-8 document
由于我们在 PowerShell 6.0 中推出无 BOM 的 UTF-8,更新了 New-ModuleManifest
cmdlet 以创建无 BOM 的 UTF-8 文档,而不是 UTF-16 文档。
从 PSMethod 到委托的转换Conversions from PSMethod to Delegate
感谢 的帮助,我们现已支持将 PSMethod
转换为委托。这允许执行类似于将 PSMethod
[M]::DoubleStrLen
作为委托值传递到 [M]::AggregateString
中的操作:
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)
有关此更改的详细信息,请参阅 PR #5287。
Measure-Object 中的标准偏差Standard deviation in Measure-Object
感谢 @CloudyDino 的帮助,我们已向 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
GetPfxCertificate -Password
感谢 @maybe-hello-world 的帮助,Get-PfxCertificate
现已具备采用 SecureString
的 Password
参数。这允许以非交互方式使用它:
$certFile = '\\server\share\pwd-protected.pfx'
$certPass = Read-Host -AsSecureString -Prompt 'Enter the password for certificate: '
$certThumbPrint = (Get-PfxCertificate -FilePath $certFile -Password $certPass ).ThumbPrint
在过去,PowerShell 在 Windows 上发布了一个名为 more
的函数,它包含 more.com
。该函数现在已删除。
此外,help
函数已改为在 Windows 上使用 more.com
,或在非 Windows 平台上使用 $env:PAGER
指定的系统默认页导航。
cd DriveName: 现在将用户返回到该驱动器中的当前工作目录cd DriveName: now returns users to the current working directory in that drive
以前使用 Set-Location
或 cd
返回到 PSDrive 会将用户发送到该驱动器的默认位置。
感谢 @mcbobke 的帮助,现在会将用户发送到该会话最后一个已知的当前工作目录。
Windows PowerShell 类型加速器Windows PowerShell type accelerators
我们已在 Windows PowerShell 中包括以下类型加速器,以便更轻松地处理它们对应的类型:
[adsi]
:System.DirectoryServices.DirectoryEntry
[adsisearcher]
:System.DirectoryServices.DirectorySearcher
[wmi]
:System.Management.ManagementObject
[wmiclass]
:System.Management.ManagementClass
[wmisearcher]
:System.Management.ManagementObjectSearcher
这些类型的加速器未包含在 PowerShell 6 中,但已添加到在 Windows 上运行的 PowerShell 6.1 中。
这些类型可用于轻松构建 AD 和 WMI 对象。
例如,可以使用 LDAP 进行查询:
[adsi]'LDAP://CN=FooUse,OU=People,DC=contoso,DC=com'
以下示例创建 Win32_OperatingSystem CIM 对象:
[wmi]"Win32_OperatingSystem=@"
SystemDirectory : C:\WINDOWS\system32
Organization : Contoso IT
BuildNumber : 18234
RegisteredUser : Contoso Corp.
SerialNumber : 12345-67890-ABCDE-F0123
Version : 10.0.18234
此示例返回 Win32_OperatingSystem 类的 ManagementClass 对象。
[wmiclass]"Win32_OperatingSystem"
NameSpace: ROOT\cimv2
Name Methods Properties
---- ------- ----------
Win32_OperatingSystem {Reboot, Shutdown... {BootDevice, BuildNumber, BuildType, Caption...}
所有 -LiteralPath 参数的 -lp 别名-lp alias for all -LiteralPath parameters
感谢 的帮助,我们现在为所有具有 -LiteralPath
参数的内置 PowerShell cmdlet 提供了参数别名 -lp
。
Windows 上基于 MSI 的安装路径MSI-based installation paths on Windows
在 Windows 上,MSI 包现在会安装到以下路径:
$env:ProgramFiles\PowerShell\6\
用于稳定安装 6.x$env:ProgramFiles\PowerShell\6-preview\
用于 6.x 的预览安装
此更改确保 Microsoft Update 可以更新/服务于 PowerShell Core。
有关详细信息,请查看 。
只能使用环境变量禁用遥测Telemetry can only be disabled with an environment variable
PowerShell Core 在启动时会向 Microsoft 发送基本的遥测数据。该数据包括 OS 名称、OS 版本和 PowerShell 版本。此数据帮助我们更好地了解使用 PowerShell 的环境,并能确定新功能和修复的优先级。
要选择退出此遥测,请将环境变量 POWERSHELL_TELEMETRY_OPTOUT
设置为 true
、yes
或 1
。我们不再支持删除文件 DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY
以禁用遥测。
在 Unix 平台上的 PowerShell 远程处理中禁用 HTTP 基本身份验证Disallowed Basic Auth over HTTP in PowerShell Remoting on Unix platforms
为了防止使用未加密的流量,Unix 平台上的 PowerShell 远程处理现在需要使用 NTLM/Negotiate 或 HTTPS。
有关这些更改的详细信息,请查看问题 #6779。
在过去,可以使用 Add-Type
cmdlet 编译 Visual Basic 代码。Visual Basic 很少与 Add-Type
一起使用。我们已删除此功能以减小 PowerShell 的大小。