PowerShell 7.1 的新功能

我們在 2020 年 11 月 11 日 宣佈 PowerShell 7.1 正式推出。 依據 PowerShell 7.0 所建立的基礎,我們將目標專注在社群問題上,並包含了數個改進與修正。 我們致力於確保 PowerShell 能持續成為穩定且高效能的平台。

PowerShell 7.1 包含下列功能、更新和重大變更。

  • PSReadLine 2.1.0,其中包含預測 IntelliSense
  • PowerShell 7.1 已發佈至 Microsoft Store
  • 已針對支援 ARM64 的新 OS 版本更新安裝程式套件
  • 4 個新的實驗功能和 2 個實驗性功能已升階為主流
  • 數個重大變更以改善可用性

如需完整的變更清單,請參閱 GitHub 存放庫中的 CHANGELOG

PSReadLine 2.1.0

PowerShell 7.1 也包含 PSReadLine 2.1.0。 此版本包含預測性 IntelliSense。 如需預測性 IntelliSense 功能的詳細資訊,請參閱 PowerShell 部落格中的公告 \(英文\)。

Microsoft Store 安裝程式套件

PowerShell 7.1 已經發佈至 Microsoft Store。 您可以在 Microsoft Store 網站上或 Windows 的 [Store] 應用程式中找到該 PowerShell 版本。

Microsoft Store 套件的優點:

  • Windows 中內建的自動更新
  • 與其他軟體散發機制 (例如 Intune 與 SCCM) 的整合

注意

儲存在 $PSHOME 中的所有系統層級組態設定都無法修改。 這包含 WSMAN 設定。 這會防止遠端工作階段連線到 PowerShell 的 Store 型安裝。 支援使用者層級設定與 SSH 遠端功能。

其他安裝程式

如需更多有關支援的作業系統和支援週期的最新資訊,請參閱 PowerShell 支援週期

請查看適用於您慣用作業系統的安裝指示:

此外,PowerShell 7.1 支援 Debian、Ubuntu 與 ARM64 Alpine Linux 的 ARM32 和 ARM64 變體。

雖然尚未正式支援,但該社群也會提供適用於 Arch 和 Kali Linux 的套件。

注意

Debian 10+、CentOS 8+、Ubuntu 20.04、Alpine 與 Arm 目前不支援 WinRM 遠端處理。 如需設定 SSH 型遠端處理的詳細資訊,請參閱透過 SSH 的 PowerShell 遠端處理

實驗性功能

如需實驗性功能的詳細資訊,請參閱使用實驗性功能

下列實驗性功能現在是此版本中的主要功能:

此版本中已新增下列實驗性功能:

  • Microsoft.PowerShell.Utility.PSManageBreakpointsInRunspace

    • PowerShell 7.1 擴充此實驗性功能,將 Runspace 參數新增至所有 *-PSBreakpoint Cmdlet。 Runspace 參數會指定 Runspace 物件以與所指定 Runspace 中的中斷點互動。
  • PSNativePSPathResolution - 此功能可讓您將 PowerShell 提供者路徑傳遞至不支援 PowerShell 路徑語法的原生命令。

  • PSCultureInvariantReplaceOperator - 運算子語句中的 -replace 左側運算元不是字串時,該運算元會轉換成字串。 啟用此功能時,轉換不會使用文化特性設定進行字串轉換。

  • PSSubsystemPluginModel 是支援未來預測性 IntelliSense 外掛程式的基礎。

中斷性變更和改進

  • .NET 5.0 中的字串比較行為已變更

    PowerShell 7.1 建置在 .NET 5.0 上,其引進了下列重大變更:

    從 .NET 5.0 起,文化特性不變異字串比較會忽略非列印控制字元。

    例如,下列兩個字串會視為相同:

    # Escape sequence "`a" is Ctrl-G or [char]7
    'Food' -eq "Foo`ad"
    
    True
    
  • 修正 $? 為當 $false 原生命令寫入 stderr (#13395)

    原生命令通常會寫入, stderr 而不想要指出失敗。 只有在原生命令也有非零的結束代碼時,才會將此變更 $? 設定 $false 為 。 這項變更與實驗性功能 PSNotApplyErrorActionToStderr 無關。

  • 使 $ErrorActionPreference 不會影響 stderr 原生命令的輸出 (#13361)

    原生命令通常會寫入, stderr 而不想要指出失敗。 使用此變更時, stderrErrorRecord物件中仍會擷取輸出,但如果ErrorRecord來自原生命令,執行時間就不會再套用 $ErrorActionPreference

  • 重新命名 -FromUnixTime-UnixTimeSeconds [開啟 Get-Date ] 以允許 Unix 時間輸入 (#13084) (感謝 @aetos382!)

    參數 -FromUnixTime 是在 7.1-preview.2 期間新增的。 參數已重新命名,以更符合資料類型。 此參數採用整數值,表示自 1970 年 1 月 1 日 0:00:00 起的秒數。

    這個範例會將自 1970-01-01-01 0:00:00) 起的秒數轉換成 DateTime 所代表的 Unix 時間 (。

    Get-Date -UnixTimeSeconds 1577836800
    
    Wednesday, January 01, 2020 12:00:00 AM
    
  • 允許明確指定具名參數以取代來自雜湊表展開的相同參數 (#13162)

    透過這項變更,來自 splatting 的具名參數會移至參數清單的結尾,以便在所有明確指定的具名參數都系結之後系結它們。 找不到指定的具名參數時,簡單函式的參數系結不會擲回錯誤。 未知的具名參數會系結至 $args 簡單函式的參數。 將 splatting 移至引數清單的結尾,會變更參數出現在 中的 $args 順序。

    例如:

    function SimpleTest {
        param(
            $Name,
            $Path
        )
        "Name: $Name; Path: $Path; Args: $args"
    }
    

    在先前的行為中, MyPath 不會系結至 -Path ,因為它是引數清單中的第三個引數。 ## 因此,最後會填入 '$args' 和 Blah = "World"

    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
    
  • 讓 switch 參數 -Qualifier 不是位置的 Split-Path (#12960) (感謝 @yecril71pl!)

  • 將工作目錄解析為 Start-Process 未指定 (#11946) (感謝 @NoMoreFood!)

  • -OutFile Web Cmdlet 中的參數運作方式如 -LiteralPath (#11701) (感謝 @iSazonov!)

  • BigInteger修正數值常值 (#11634) (感謝@vexx32!)

  • 在 Windows 上, Start-Process 使用 -UseNewEnvironment 建立新的預設進程環境 (# 10830) (感謝 @iSazonov!)

  • 將 轉換成 ScriptBlock 委派 (#10619) 時,請勿包裝傳回結果 PSObject

    ScriptBlock當 轉換成要用於 C# 內容的委派型別時,將結果包裝在 PSObject 中會產生不必要的問題:

    • 當值轉換成委派傳回型別時, PSObject 基本上會解除包裝。 PSObject因此不需要 。
    • 當委派傳回型別為 object 時,它會包裝在 中 PSObject ,使其難以在 C# 程式碼中使用。

    變更之後,傳回的物件就是基礎物件。