共用方式為


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 - 當 operator 語句中的 -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 (#13361) 產生不會影響stderr原生命令的輸出

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

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

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

    本範例會將從 1970-01-01-01 0:00:00) 起的秒數,將 Unix 時間 (轉換成 DateTime。

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

    透過這項變更,展開的具名參數會移至參數清單的結尾,以便系結在所有明確指定的具名參數係結之後。 找不到指定的具名參數時,簡單函式的參數係結不會擲回錯誤。 未知的具名參數會系結至 $args 簡單函式的 參數。 將展開移至自變數清單結尾,會變更參數出現在 中 $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# 程式代碼中使用。

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