在 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…
PSSubsystemPluginModel              True PSEngine A plugin model for registering and un-registering…

使用 Enable-ExperimentalFeatureDisable-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版本
名稱 7.2 7.3 7.4 7.5 (預覽)
PSCommandNotFoundSuggestion 實驗 實驗 實驗 實驗
PSDesiredStateConfiguration.InvokeDscResource 實驗 實驗 實驗 實驗
PSNativePSPathResolution 實驗 已終止
PSSubsystemPluginModel 實驗 實驗 實驗 實驗
PSNativeCommandArgumentPassing 實驗 主流
PSAnsiRenderingFileInfo 實驗 主流
PSLoadAssemblyFromNativeCode 實驗 實驗 實驗 實驗
PSNativeCommandErrorActionPreference 實驗 主流
PSFeedbackProvider 實驗 實驗
PSModuleAutoLoadSkipOfflineFiles 實驗 實驗
PSCommandWithArgs 實驗 實驗
PSNativeWindowsTildeExpansion 實驗

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

建議在 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

這項功能會啟用 -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

啟用此功能后,如果使用者的 PSModulePath 包含來自雲端提供者的資料夾,例如 OneDrive,PowerShell 就不會再觸發下載該資料夾中包含的所有檔案。 系統會略過標示為未下載的任何檔案。 使用雲端提供者在計算機之間同步模組的使用者,應將模組資料夾標示為 [已釘選 ] 或 OneDrive 以外的提供者的對等狀態。 將模組資料夾標示為 Pinned 可確保檔案一律保留在磁碟上。

此功能已在 PowerShell 7.4-preview.1 中新增。

PSNativeCommandArgumentPassing

注意

此功能在PowerShell 7.3中成為主流。

啟用此實驗性功能時,PowerShell 會使用 ArgumentList 對象的 屬性 StartProcessInfo ,而不是我們在叫用原生可執行檔時重建字串的目前機制。

警告

新行為是 目前行為的重大變更 。 這可能會中斷在叫用原生應用程式時解決各種問題的腳本和自動化。 在過去,必須逸出引號,而且無法為原生應用程式提供空的自變數。 使用停止剖析令牌--%) 或 Start-Process Cmdlet 來避開在需要時傳遞的原生自變數。

這項功能會新增可控制此行為的喜好 $PSNativeCommandArgumentPassing 設定變數。 此變數可讓您在運行時間選取行為。 合法值為 LegacyStandardWindows。 默認行為是平臺特定的。 在 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如果 設定為 LegacyStandard,則剖析器不會檢查這些檔案。

默認行為是平臺特定的。 在 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 上),則不會發生路徑正規化
  • 如果路徑是以單引號表示,則不會解析並視為常值

PSSubsystemPluginModel

此功能可在PowerShell中啟用子系統外掛程式模型。 此功能可讓您將的 System.Management.Automation.dll 元件分成位於其本身元件中的個別子系統。 此區隔可減少核心 PowerShell 引擎的磁碟使用量,並讓這些元件成為最小 PowerShell 安裝的選用功能。

目前僅 支援 CommandPredictor 子系統。 此子系統會與 PSReadLine 模組搭配使用,以提供自定義預測外掛程式。 未來, JobCommandCompleterRemoting 和其他元件可以分成 外部 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 中新增。