在 PowerShell 中使用實驗性功能
PowerShell 中的實驗性功能支援提供一種機制,讓實驗性功能與 PowerShell 或 PowerShell 模組中現有的穩定功能共存。
實驗性功能是未完成設計的實驗功能。 此功能可供用戶測試並提供意見反應。 完成實驗性功能之後,設計變更就會變成重大變更。
警告
實驗性功能不適用於生產環境,因為允許變更中斷。 未正式支持實驗性功能。 不過,我們很欣賞任何意見反應和錯誤報告。 您可以在 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 中就無法再使用該功能。 例如,此功能 PSNativePSPathResolution
已在PowerShell 7.3中停止。
可用的功能
本文說明可用的實驗性功能,以及如何使用此功能。
圖例
- 圖示 表示實驗性功能可在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 中成為主流。
這項功能會啟用 -CommandWithArgs
的參數 pwsh
。 此參數可讓您使用自變數來執行 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 狀態設定 v3。
PSFeedbackProvider
當您啟用此功能時,PowerShell 會使用新的意見反應提供者,在找不到命令時提供意見反應。 意見反應提供者是可延伸的,而且可由第三方模組實作。 其他子系統可以使用意見反應提供者,例如預測子子系統來提供預測性 IntelliSense 結果。
此功能包含兩個內建的意見反應提供者:
GeneralCommandErrorFeedback 提供目前現有的相同建議功能
Linux 上提供的 UnixCommandNotFound 提供類似 bash 的意見反應。
UnixCommandNotFound 同時作為意見反應提供者和預測器。 在互動式執行中找不到命令時,會使用命令找不到的建議,以及提供下一個命令行的預測性 IntelliSense 結果時提供意見反應。
此功能已在 PowerShell 7.4-preview.3 中新增。
PSLoadAssemblyFromNativeCode
公開 API 以允許從機器碼載入元件。
PSModuleAutoLoadSkipOfflineFiles
注意
此功能在 PowerShell 7.5-preview.5 中成為主流。
啟用此功能后,如果使用者的 PSModulePath 包含來自雲端提供者的資料夾,例如 OneDrive,PowerShell 就不會再觸發下載該資料夾中包含的所有檔案。 系統會略過標示為未下載的任何檔案。 使用雲端提供者在計算機之間同步模組的使用者,應將模組資料夾標示為 [已釘選 ] 或 OneDrive 以外的提供者的對等狀態。 將模組資料夾標示為 Pinned 可確保檔案一律保留在磁碟上。
此功能已在 PowerShell 7.4-preview.1 中新增。
PSNativeCommandArgumentPassing
注意
此功能在PowerShell 7.3中成為主流。
啟用此實驗性功能時,PowerShell 會使用 ArgumentList
對象的 屬性 StartProcessInfo
,而不是我們在叫用原生可執行檔時重建字串的目前機制。
警告
新行為是 目前行為的重大變更 。 這可能會中斷在叫用原生應用程式時解決各種問題的腳本和自動化。 在過去,必須逸出引號,而且無法為原生應用程式提供空的自變數。
使用停止剖析令牌 (--%
) 或 Start-Process
Cmdlet 來避開在需要時傳遞的原生自變數。
這項功能會新增可控制此行為的喜好 $PSNativeCommandArgumentPassing
設定變數。 此變數可讓您在運行時間選取行為。 合法值為 Legacy
、 Standard
與 Windows
。 默認行為是平臺特定的。 在 Windows 平臺上,預設設定為 Windows
,非 Windows 平台預設為 Standard
。
Legacy
是歷史行為。 和 Standard
模式的行為Windows
相同,但在 模式中Windows
,下列檔案的調用會自動使用Legacy
傳遞的 style 自變數。
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 會在叫用原生命令之前,先將未加上批注的波狀符號 (~
) 展開至使用者的目前主資料夾。 下列範例顯示功能的運作方式。
停用功能時,會將 tilde 傳遞至原生命令做為常值字串。
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 根據 或 UInt64/ulong
串行化任何列舉值Int64/long
,而不是該列舉值的字串表示。 這會將列舉串行化的行為與其他列舉基底類型對齊,其中 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" }