使用 PowerShell 中的实验性功能
PowerShell 中的实验性功能支持提供了一种机制,可便于实验性功能与 PowerShell 或 PowerShell 模块中的现有稳定功能共存。
实验性功能是指设计尚未最终确定的功能。 此类功能可供用户进行测试和提供反馈。 一旦实验性功能最终确定下来,设计变更就变成了中断性变更。
注意
实验性功能不适合在生产环境中使用,因为允许变更成为中断性变更。 实验性功能不受官方支持。 不过,我们非常期望收到你的反馈和 Bug 报告。 你可以在 GitHub 源存储库中提出问题。
若要详细了解如何启用或禁用这些功能,请参阅 about_Experimental_Features。
试验性功能生命周期
Get-ExperimentalFeature cmdlet 返回 PowerShell 可用的所有试验性功能。
试验性功能可能来自模块或 PowerShell 引擎。 仅在导入模块后可使用基于模块的试验性功能。 在以下示例中,不会加载 PSDesiredStateConfiguration ,因此 PSDesiredStateConfiguration.InvokeDscResource
功能不可用。
Get-ExperimentalFeature
Name Enabled Source Description
---- ------- ------ -----------
PSCommandNotFoundSuggestion False PSEngine Recommend potential commands based on fuzzy searc…
PSCommandWithArgs False PSEngine Enable `-CommandWithArgs` parameter for pwsh
PSFeedbackProvider True PSEngine Replace the hard-coded suggestion framework with …
PSLoadAssemblyFromNativeCode False PSEngine Expose an API to allow assembly loading from nati…
PSModuleAutoLoadSkipOfflineFiles True PSEngine Module discovery will skip over files that are ma…
PSSerializeJSONLongEnumAsNumber True PSEngine Serialize enums based on long or ulong as an nume…
PSSubsystemPluginModel True PSEngine A plugin model for registering and un-registering…
使用 Enable-ExperimentalFeature 和 Disable-ExperimentalFeature cmdlet 启用或禁用某功能。 必须启动新的 PowerShell 会话才能使此更改生效。 运行以下命令以启用 PSCommandNotFoundSuggestion
功能:
Enable-ExperimentalFeature PSCommandNotFoundSuggestion
WARNING: Enabling and disabling experimental features do not take effect until next start
of PowerShell.
当某个试验性功能成为主流功能时,它不再可用作试验性功能,因为该功能已是 PowerShell 引擎或模块的一部分。 例如,如果 PSAnsiRenderingFileInfo
功能成为 PowerShell 7.3 中的主流功能。 你会自动获得该功能的所有功能。
注意
某些功能有配置要求,如首选项变量,需要将其设置为从该功能中获取所需结果。
当某试验性功能停用时,该功能在 PowerShell 中不再可用。 例如,PowerShell 7.3 中停用了 PSNativePSPathResolution
功能。
可用功能
本文介绍了可用的实验性功能及其用法。
图例
- 图标指示试验性功能在该 PowerShell 版本中可用
- 图标指示以实验性功能作为主要功能的 PowerShell 版本
- 图标指示删除了试验性功能的 PowerShell 版本
PSAnsiRenderingFileInfo
注意
此功能在 PowerShell 7.3 中成为主流。
PowerShell 7.2 中增加了 ANSI 格式设置功能。 此功能添加 $PSStyle.FileInfo
成员,并启用特定文件类型的着色。
$PSStyle.FileInfo.Directory
- 用于指定目录颜色的内置成员$PSStyle.FileInfo.SymbolicLink
- 用于指定符号链接颜色的内置成员$PSStyle.FileInfo.Executable
- 用于指定可执行文件颜色的内置成员。$PSStyle.FileInfo.Extension
- 使用此成员定义不同文件扩展名的颜色。 “扩展”成员预先包括存档和 PowerShell 文件的扩展。
有关详细信息,请参阅 about_Automatic_Variables。
PSCommandNotFoundSuggestion
注意
此功能在 PowerShell 7.5-preview.5 中成为主流。
在 CommandNotFoundException 后根据模糊匹配搜索来建议可能命令。
PS> get
get: The term 'get' isn't 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.
Suggestion [4,General]: The most similar commands are: set, del, ft, gal, gbp, gc, gci,
gcm, gdr, gcs.
PSCommandWithArgs
注意
此功能在 PowerShell 7.5-preview.5 中成为主流。
此功能为 pwsh
启用 -CommandWithArgs
形参。 通过此形参,可使用实参执行 PowerShell 命令。 与 -Command
不同,此形参填充可供命令使用的 $args
内置变量。
第一个字符串是命令,后面用空格分隔的字符串是实参。
例如:
pwsh -CommandWithArgs '$args | % { "arg: $_" }' arg1 arg2
该示例产生下面的输出:
arg: arg1
arg: arg2
此功能已添加到 PowerShell 7.4-preview.2 中。
PSDesiredStateConfiguration.InvokeDscResource
支持在非 Windows 系统上编译为 MOF,并支持在没有 LCM 的情况下使用 Invoke-DSCResource
。
从 PowerShell 7.2 开始,PSDesiredStateConfiguration 模块已删除,此功能默认处于禁用状态。 若要启用此功能,必须从 PowerShell 库安装 PSDesiredStateConfiguration v2.0.5 模块,并启用此功能。
DSC v3 没有此实验性功能。 DSC v3 仅支持 Invoke-DSCResource
,不使用或支持 MOF 编译。 有关详细信息,请参阅 PowerShell Desired State Configuration v3。
PSFeedbackProvider
启用此功能后,PowerShell 会在找不到命令时使用新反馈提供程序提供反馈。 反馈提供程序是可扩展的,并且可由第三方模块实现。 其他子系统(如预测器子系统)可以使用反馈提供程序提供预测 IntelliSense 结果。
此功能包括两个内置反馈提供程序:
GeneralCommandErrorFeedback 提供目前存在的相同建议功能
Linux 上的 UnixCommandNotFound 提供类似于 bash 的反馈。
UnixCommandNotFound 同时充当反馈提供程序和预测器。 command-not-found 命令的建议既用于在交互式运行中找不到命令时提供反馈,也用于为下一个命令行提供预测 IntelliSense 结果。
此功能是在 PowerShell 7.4-preview.3 中添加的。
PSLoadAssemblyFromNativeCode
公开 API 以便能从本机代码加载程序集。
PSModuleAutoLoadSkipOfflineFiles
注意
此功能在 PowerShell 7.5-preview.5 中成为主流。
启用此功能后,如果用户的 PSModulePath 包含来自云提供商(如 OneDrive)的文件夹,PowerShell 将不再触发该文件夹中包含的所有文件的下载。 将跳过标记为“未下载”的任何文件。 使用云提供商在计算机之间同步模块的用户应将模块文件夹标记为“已固定”或 OneDrive 以外的提供商的等效状态。 将模块文件夹标记为“已固定”可确保文件始终保留在磁盘上。
此功能是在 PowerShell 7.4-preview.1 中添加的。
PSNativeCommandArgumentPassing
注意
此功能在 PowerShell 7.3 中成为主流。
启用此实验性功能后,PowerShell 将使用 StartProcessInfo
对象的 ArgumentList
属性,而不是我们目前在调用本机可执行文件时重建字符串的机制。
注意
新行为是对当前行为的中断性变更。 在调用本机应用程序时,这可能会中断用于解决各种问题的脚本和自动化。 过去,必须对引号进行转义,而且不能为本机应用程序提供空参数。
使用停止分析令牌 (--%
) 或 Start-Process
cmdlet 可在需要时避开本机参数传递。
此功能添加了一个新的 $PSNativeCommandArgumentPassing
首选项变量,用于控制此行为。 可使用此变量选择运行时的行为。 有效值是 Legacy
、Standard
和 Windows
。 默认行为特定于平台。 在 Windows 平台上,默认设置为 Windows
,在非 Windows 平台上,默认为 Standard
。
Legacy
是历史行为。 Windows
和 Standard
模式的行为相同,但在 Windows
模式下,对以下文件的调用将自动使用 Legacy
样式参数传递。
cmd.exe
find.exe
cscript.exe
wscript.exe
sqlcmd.exe
- 在 PowerShell 7.3.1 中添加- 以
.bat
结尾 - 以
.cmd
结尾 - 以
.js
结尾 - 以
.vbs
结尾 - 以
.wsf
结尾
如果 $PSNativeCommandArgumentPassing
设置为 Legacy
或 Standard
,分析程序不会检查这些文件。
默认行为特定于平台。 在 Windows 平台上,默认设置为 Windows
,在非 Windows 平台上则为 Standard
。
注意
下面的示例使用 TestExe.exe
工具。 可从源代码生成 TestExe
。
请参阅 PowerShell 源存储库中的 TestExe。
此更改提供的新行为:
将保留带有嵌入引号的文本或可扩展字符串:
PS> $a = 'a" "b' PS> TestExe -echoargs $a 'c" "d' e" "f Arg 0 is <a" "b> Arg 1 is <c" "d> Arg 2 is <e f>
将保留作为参数的空字符串:
PS> TestExe -echoargs '' a b '' Arg 0 is <> Arg 1 is <a> Arg 2 is <b> Arg 3 is <>
有关新行为的更多示例,请参阅 about_Parsing。
PowerShell 7.3 还添加了跟踪本机命令的参数绑定的功能。 有关更多信息,请参阅 Trace-Command。
PSNativeCommandErrorActionPreference
注意
此功能在 PowerShell 7.4 中成为主流。
本机命令通常向调用应用程序返回一个退出代码,成功时为零,失败则为非零。 但是,本机命令当前不参与 PowerShell 错误流。 重定向的 stderr 输出的解释与 PowerShell 错误流不同。 许多本机命令使用 stderr 作为信息或详细流,因此只有退出代码才重要。 在其脚本中使用本机命令的用户需要在每次调用后检查退出状态,使用类似于下面的示例:
if ($LASTEXITCODE -ne 0) {
throw "Command failed. See above errors for details"
}
然而,此示例并不支持 $?
可能由于 cmdlet 或函数错误而为 false、导致 $LASTEXITCODE
过时的所有情况。
此功能实现了 $PSNativeCommandUseErrorActionPreference
首选项变量,该变量控制如何在 PowerShell 中处理本机命令错误。 这允许本机命令失败生成错误对象,这些错误对象被添加到 PowerShell 错误流中,并可能终止脚本的执行而无需额外处理。
默认情况下,$PSNativeCommandUseErrorActionPreference
设置为 $false
。 将首选项设置为 $true
后,会发生以下行为:
- 在
$ErrorActionPreference = 'Stop'
情况下,当本机命令返回非零退出代码时,脚本将中断。 - 在
$ErrorActionPreference = 'Continue'
情况下(默认),会看到针对本机命令错误的 PowerShell 错误消息,但脚本不会中断。
PSNativePSPathResolution
注意
此实验性功能已在 PowerShell 7.3 中删除,并且不再受支持。
如果使用 FileSystem 提供程序的 PSDrive 路径传递给本机命令,那么解析的文件路径就会传递给本机命令。 也就是说,像 code temp:/test.txt
这样的命令现在可以正常运行了。
另外,在 Windows 上,如果路径以 ~
开头,那么路径会解析为完整路径,并传递给本机命令。 在这两种情况下,路径都会规范化为相关操作系统的目录分隔符。
- 如果路径不是 PSDrive 或
~
(在 Windows 上),则不会进行路径规范化 - 如果路径是用单引号引住,则不会进行解析,而是被视为文本
PSRedirectToVariable
注意
此实验性功能是在 PowerShell 7.5-preview.4 中添加的。
启用后,此功能添加了对重定向到变量驱动器的支持。 此功能允许使用 variable:name
语法将数据重定向到变量。 PowerShell 检查重定向的目标,如果它使用变量提供程序,则会调用 Set-Variable
,而不是 Out-File
。
以下示例展示了如何将命令的输出重定向到变量:
. {
"Output 1"
Write-Warning "Warning, Warning!"
"Output 2"
} 3> variable:warnings
$warnings
Output 1
Output 2
WARNING: Warning, Warning!
PSSubsystemPluginModel
此功能在 PowerShell 中启用子系统插件模型。 利用此功能,可以将 System.Management.Automation.dll
的组件分隔到驻留在自己的程序集中的各个子系统。 这种隔离可减少核心 PowerShell 引擎的磁盘占用,并支持这些组件成为最小 PowerShell 安装的可选功能。
目前仅支持 CommandPredictor 子系统。 该子系统与 PSReadLine 模块一起使用,以提供自定义预测插件。 将来 ,Job、CommandCompleter、Remoting 和其他组件可以分隔到 System.Management.Automation.dll
外的子系统程序集。
试验性功能包括新的 cmdlet Get-PSSubsystem。 只有启用此功能时,此 cmdlet 才可用。 此 cmdlet 将返回有关系统上可用子系统的信息。
PSNativeWindowsTildeExpansion
启用此功能后,PowerShell 会在调用本机命令之前将未加引号的波浪号 (~
) 展开到用户的当前主文件夹。 下面的示例演示了该功能的工作原理。
禁用该功能后,波浪号将作为文本字符串传递到本机命令。
PS> cmd.exe /c echo ~
~
启用该功能后,PowerShell 将展开波浪号,然后再将其传递给本机命令。
PS> cmd.exe /c echo ~
C:\Users\username
此功能仅适用于 Windows。 在非 Windows 平台上,波浪号展开在本机完成。
此功能是在 PowerShell 7.5-preview.2 中添加的。
PSSerializeJSONLongEnumAsNumber
此功能使 cmdlet ConvertTo-Json 能够将基于 Int64/long
或 UInt64/ulong
的任何枚举值序列化为数值,而不是该枚举值的字符串表示形式。 这使枚举序列化的行为与其他枚举基类型的行为保持一致,其中 cmdlet 将枚举序列化为其数值。 使用 EnumsAsStrings 参数序列化为字符串表示形式。
例如:
# PSSerializeJSONLongEnumAsNumber disabled
@{
Key = [System.Management.Automation.Tracing.PowerShellTraceKeywords]::Cmdlets
} | ConvertTo-Json
# { "Key": "Cmdlets" }
# PSSerializeJSONLongEnumAsNumber enabled
@{
Key = [System.Management.Automation.Tracing.PowerShellTraceKeywords]::Cmdlets
} | ConvertTo-Json
# { "Key": 32 }
# -EnumsAsStrings to revert back to the old behaviour
@{
Key = [System.Management.Automation.Tracing.PowerShellTraceKeywords]::Cmdlets
} | ConvertTo-Json -EnumsAsStrings
# { "Key": "Cmdlets" }