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。
實驗性功能
如需有關實驗性功能的詳細資訊,請參閱 使用實驗性功能。
以下實驗性功能現已成為本版本的主流功能:
本版本新增了以下實驗性功能:
Microsoft.PowerShell.Utility.PSManageBreakpointsInRunspace
- PowerShell 7.1 將此實驗性功能擴展至所有
*-PSBreakpointcmdlet 中加入 Runspace 參數。 Runspace 參數指定一個 Runspace 物件,用以與指定 runspace 中的中斷點互動。
- PowerShell 7.1 將此實驗性功能擴展至所有
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修正
$?當原生指令寫入時stderr不會是$false(#13395)原生指令常常會寫入
stderr但不打算標示失敗。 此變更$?僅在原生指令同時有非零退出碼時才設定為$false。 此變化與實驗特徵PSNotApplyErrorActionToStderr無關。讓
$ErrorActionPreferencenot affectstderr原生指令輸出(#13361)原生指令常常會寫入
stderr但不打算標示失敗。 此變更後,stderr輸出仍被 ErrorRecord 物件捕捉,但若 ErrorRecord 來自原生指令,執行時不再適用$ErrorActionPreference。將名稱改為
-FromUnixTime-UnixTimeSecondsonGet-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# 上下文中的代理型態時,將結果包裹成 aPSObject會帶來不必要的麻煩:- 當值轉換成代理回傳類型時,
PSObject基本上會展開封裝。 所以這根本不需要。PSObject - 當代理回傳類型為
object時,它會被 包裹在 中PSObject,這讓 C# 程式碼中操作起來很困難。
此變更後,回傳物件即為底層物件。
- 當值轉換成代理回傳類型時,