共用方式為


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 的新作業系統版本更新安裝套件
  • 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安裝。 支援用戶層級設定和SSH遠端處理。

其他安裝商

欲了解更多 up-to的支援作業系統及支援生命週期資訊,請參閱 PowerShell 支援生命週期

請參考你偏好作業系統的安裝說明:

此外,PowerShell 7.1 支援 Debian、Ubuntu 及 ARM64 的 ARM32 與 ARM64 版本 Alpine Linux。

雖然沒有官方支援,但社群也提供了 Arch 和 Kali Linux 的套件。

備註

Debian 10+、CentOS 8+、Ubuntu 20.04、Alpine 和 Arm 目前不支援 WinRM 遠端支援。 關於如何設定基於 SSH 的遠端處理,請參見 PowerShell Remoting over SSH

實驗性功能

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

以下實驗性功能現已成為本版本的主流功能:

本版本新增了以下實驗性功能:

突破性變更與改進

  • .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
    
  • 修正$?當原生指令寫入時stderr不會是 $false#13395

    原生指令常常會寫入 stderr 但不打算標示失敗。 此變更 $? 僅在原生指令同時有非零退出碼時才設定為 $false 。 此變化與實驗特徵 PSNotApplyErrorActionToStderr無關。

  • $ErrorActionPreference not affect stderr 原生指令輸出(#13361

    原生指令常常會寫入 stderr 但不打算標示失敗。 此變更後,stderr輸出仍被 ErrorRecord 物件捕捉,但若 ErrorRecord 來自原生指令,執行時不再適用$ErrorActionPreference

  • 將名稱改為 -FromUnixTime-UnixTimeSeconds on Get-Date ,以便允許 Unix 時間輸入(#13084)(謝謝) @aetos382!)

    -FromUnixTime 參數於 7.1-preview.2 期間新增。 參數被重新命名以更符合資料型態。 此參數取一個整數值,自1970年1月1日0:00:00起,以秒為單位。

    此範例將 Unix 時間(以 1970-01-01 0:00:00 起的秒數表示)轉換為 DateTime。

    Get-Date -UnixTimeSeconds 1577836800
    
    Wednesday, January 01, 2020 12:00:00 AM
    
  • 允許明確指定的命名參數從雜湊表 splatting 中取代相同的參數(#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
    
  • 將開關參數-Qualifier設為非位置式(Split-Path#12960)(謝謝)@yecril71pl!)

  • 當工作目錄未指定時,將工作目錄解析為文字路徑 Start-Process#11946)(謝謝) @NoMoreFood!)

  • -OutFile網頁 cmdlet 中的參數像 (#11701) 一樣運作-LiteralPath(謝謝)@iSazonov!)

  • 修正數字字面值的字串參數綁定 BigInteger#11634)(謝謝) @vexx32!)

  • 在 Windows 上, Start-Process 建立一個包含目前會話所有環境變數的程序環境,並用 -UseNewEnvironment 建立新的預設程序環境(#10830)(謝謝) @iSazonov!)

  • 轉換 a ScriptBlock 為代理時,請勿包裹回傳結果PSObject#10619

    當 a ScriptBlock 被轉換成 C# 上下文中的代理型態時,將結果包裹成 a PSObject 會帶來不必要的麻煩:

    • 當值轉換成代理回傳類型時, PSObject 基本上會展開封裝。 所以這根本不需要。PSObject
    • 當代理回傳類型為 object時,它會被 包裹在 中 PSObject ,這讓 C# 程式碼中操作起來很困難。

    此變更後,回傳物件即為底層物件。