閱讀英文

共用方式為


Windows PowerShell 5.1 與 PowerShell 7.x 之間的差異

Windows PowerShell 5.1 建置在 .NET Framework v4.5 之上。 隨著 PowerShell 6.0 的發行,PowerShell 成為建置在 .NET Core 2.0 上的開放原始碼專案。 從 .NET Framework 移至 .NET Core 可讓 PowerShell 成為跨平台解決方案。 PowerShell 會在 Windows、macOS 和 Linux 上執行。

Windows PowerShell 與 PowerShell 之間的語言差異不多。 最顯著的差異在於 Windows 與非 Windows 平台之間 PowerShell Cmdlet 的可用性和行為,以及 .NET Framework 與 .NET Core 之間差異造成的變更。

本文摘要說明 Windows PowerShell 與目前 PowerShell 版本之間的重大差異和重大變更。 此摘要不包含已新增的新功能或命令小工具。 本文也不會討論版本之間的變更。 本文的目標是要呈現 PowerShell 的目前狀態,以及與 Windows PowerShell 不同的方式。 如需版本與新增新功能之間的變更詳細討論,請參閱每個版本的 新功能 文章。

.NET Framework 與 .NET Core

Linux 和 macOS 上的 PowerShell 使用 .NET Core,這是 Microsoft windows 上完整 .NET Framework 的子集。 這很重要,因為 PowerShell 提供基礎架構類型和方法的直接存取權。 因此,由於架構的差異,在 Windows 上執行的腳本可能無法在非 Windows 平台上執行。 如需 .NET Core 變更的詳細資訊,請參閱 從 .NET Framework 移轉至 .NET Core 的重大變更

每個新版本的 PowerShell 都是建置在較新版本的 .NET 上。 .NET 中可能會有影響 PowerShell 的重大變更。

  • PowerShell 7.5 - 建置在 .NET 9.0 上
  • PowerShell 7.4 - 建置在 .NET 8.0 上
  • PowerShell 7.3 - 建置在 .NET 7.0 上
  • PowerShell 7.2 (LTS-current) - 以 .NET 6.0 為基礎 (LTS-current)
  • PowerShell 7.1 - 建置在 .NET 5.0 上
  • PowerShell 7.0 (LTS) - 建置在 .NET Core 3.1 (LTS) 上
  • PowerShell 6.2 - 建置在 .NET Core 2.1 上
  • PowerShell 6.1 - 建置在 .NET Core 2.1 上
  • PowerShell 6.0 - 建置在 .NET Core 2.0 上

隨著 .NET Standard 2.0 的出現,PowerShell 可以載入許多傳統的 Windows PowerShell 模組,而不需要修改。 此外,PowerShell 7 也包含 Windows PowerShell 相容性功能,可讓您使用仍然需要完整架構的 Windows PowerShell 模組。

如需詳細資訊,請參閱:

請注意 .NET 方法變更

雖然 .NET 方法變更並非 PowerShell 專屬,但它們可能會影響您的腳本,特別是當您直接呼叫 .NET 方法時。 此外,可能會有建構函式的新多載。 這可能會影響您使用 New-Object[type]::new() 方法建立物件的方式。

例如,.NET 新增了一些多載至 [System.String]::Split() 方法,這些多載在 .NET Framework 4.5 中無法使用。 下列清單顯示 Windows PowerShell 5.1 中可用方法的多載 Split()

PS> "".Split

OverloadDefinitions
-------------------
string[] Split(Params char[] separator)
string[] Split(char[] separator, int count)
string[] Split(char[] separator, System.StringSplitOptions options)
string[] Split(char[] separator, int count, System.StringSplitOptions options)
string[] Split(string[] separator, System.StringSplitOptions options)
string[] Split(string[] separator, int count, System.StringSplitOptions options)

下列清單顯示 PowerShell 7 中可用方法的多載 Split()

"".Split

OverloadDefinitions
-------------------
string[] Split(char separator, System.StringSplitOptions options)
string[] Split(char separator, int count, System.StringSplitOptions options)
string[] Split(Params char[] separator)
string[] Split(char[] separator, int count)
string[] Split(char[] separator, System.StringSplitOptions options)
string[] Split(char[] separator, int count, System.StringSplitOptions options)
string[] Split(string separator, System.StringSplitOptions options)
string[] Split(string separator, int count, System.StringSplitOptions options)
string[] Split(string[] separator, System.StringSplitOptions options)
string[] Split(string[] separator, int count, System.StringSplitOptions options)

在 Windows PowerShell 5.1 中,您可以將字元陣列 (char[]) 傳遞至 Split() 方法作為 string。 方法將根據陣列中的任意字元來分割目標字串。 下列命令會在 Windows PowerShell 5.1 中分割目標字串,但無法在 PowerShell 7 中分割:

# PowerShell 7 example
"1111p2222q3333".Split('pq')
1111p2222q3333

若要系結至正確的多載,您必須將字串類型傳送至字元陣列:

# PowerShell 7 example
"1111p2222q3333".Split([char[]]'pq')
1111
2222
3333

不再隨附於PowerShell的模組

基於各種相容性原因,PowerShell 不再包含下列模組。

  • ISE
  • Microsoft.PowerShell.LocalAccounts
  • Microsoft.PowerShell.ODataUtils
  • Microsoft.PowerShell.Operation.Validation
  • PSScheduledJob (排程工作)
  • PSWorkflow
  • PSWorkflowUtility

PowerShell 工作流程

PowerShell 工作流程 是 Windows PowerShell 中的一項功能,建置在 Windows Workflow Foundation (WF) 之上, 可針對長時間執行或平行處理的工作建立健全的 Runbook。

由於 .NET Core 中缺少 Windows Workflow Foundation 的支持,我們已從 PowerShell 移除 PowerShell 工作流程。

未來,我們想要在PowerShell語言中啟用原生平行處理原則/並行,而不需要PowerShell工作流程。

如果需要在 OS 重新啟動之後使用檢查點繼續腳本,建議您使用工作排程器在 OS 啟動時執行腳本,但腳本必須維持自己的狀態(例如將它保存至檔案)。

從 PowerShell 移除的 Cmdlet

針對 PowerShell 中包含的模組,基於各種相容性原因,或使用不支援的 API,下列 Cmdlet 已從 PowerShell 中移除。

CimCmdlets

  • Export-BinaryMiLog

Microsoft.PowerShell.Core

  • Add-PSSnapin
  • Export-Console
  • Get-PSSnapin
  • Remove-PSSnapin
  • Resume-Job
  • Suspend-Job

Microsoft.PowerShell.Diagnostics

  • Export-Counter
  • Import-Counter

Microsoft.PowerShell.Management

  • Add-Computer
  • Checkpoint-Computer
  • Clear-EventLog
  • Complete-Transaction
  • Disable-ComputerRestore
  • Enable-ComputerRestore
  • Get-ComputerRestorePoint
  • Get-ControlPanelItem
  • Get-EventLog
  • Get-Transaction
  • Get-WmiObject
  • Invoke-WmiMethod
  • Limit-EventLog
  • New-EventLog
  • New-WebServiceProxy
  • Register-WmiEvent
  • Remove-Computer
  • Remove-EventLog
  • Remove-WmiObject
  • Reset-ComputerMachinePassword
  • Restore-Computer
  • Set-WmiInstance
  • Show-ControlPanelItem
  • Show-EventLog
  • Start-Transaction
  • Test-ComputerSecureChannel
  • Undo-Transaction
  • Use-Transaction
  • Write-EventLog

Microsoft.PowerShell.Utility

  • Convert-String
  • ConvertFrom-String

PSDesiredStateConfiguration

  • Disable-DscDebug
  • Enable-DscDebug
  • Get-DscConfiguration
  • Get-DscConfigurationStatus
  • Get-DscLocalConfigurationManager
  • Publish-DscConfiguration
  • Remove-DscConfigurationDocument
  • Restore-DscConfiguration
  • Set-DscLocalConfigurationManager
  • Start-DscConfiguration
  • Stop-DscConfiguration
  • Test-DscConfiguration
  • Update-DscConfiguration

WMI v1 Cmdlet工具

下列 WMI v1 Cmdlet 已從 PowerShell 中移除:

  • Register-WmiEvent
  • Set-WmiInstance
  • Invoke-WmiMethod
  • Get-WmiObject
  • Remove-WmiObject

CimCmdlet 模組 (也稱為 WMI v2) Cmdlet 會執行相同的函式,並提供新功能和重新設計的語法。

New-WebServiceProxy 已移除 cmdlet

.NET Core 不支援使用 SOAP 通訊協定的 Windows Communication Framework。 此 Cmdlet 已移除,因為它需要SOAP。

*-Transaction 已移除 Cmdlet

這些 Cmdlet 的使用非常有限。 決定停止支持他們。

  • Complete-Transaction
  • Get-Transaction
  • Start-Transaction
  • Undo-Transaction
  • Use-Transaction

*-EventLog Cmdlet

由於使用不支援的 API,Cmdlet *-EventLog 已從 PowerShell 中移除。 Get-WinEventNew-WinEvent 可在 Windows 上取得和建立事件。

使用 Windows Presentation Framework(WPF) 的 Cmdlet

.NET Core 3.1 新增了 WPF 的支援,因此 PowerShell 7.0 版本還原了下列 Windows 特定功能:

  • Cmdlet Show-Command
  • Cmdlet Out-GridView
  • ShowWindow 參數Get-Help

PowerShell 預期狀態設定 (DSC) 變更

Invoke-DscResource 已在 PowerShell 7.0 中還原為實驗性功能。

從 PowerShell 7.2 開始,PSDesiredStateConfiguration 模組已從 PowerShell 中移除,並已發佈至 PowerShell 資源庫。 如需詳細資訊,請參閱PowerShell小組部落格中的 公告

PowerShell 執行檔變動

已重新 powershell.exe 命名為 pwsh.exe

PowerShell 的二進位名稱已從 powershell(.exe) 變更為 pwsh(.exe)。 這項變更提供決定性的方式,讓使用者在機器上執行 PowerShell,並支援 Windows PowerShell 和 PowerShell 的並存安裝。

pwsh(.exe)的其他變更來自powershell.exe

  • 將第一個位置參數從 -Command 變更為 -File。 這項變更修正 #! 了在非 Windows 平臺上從非 PowerShell 殼層執行的 PowerShell 腳本中使用 (也稱為 shebang)。 這也表示您可以執行類似 pwsh foo.ps1pwsh fooScript 的命令,而不指定 -File。 不過,這項變更要求您在嘗試執行諸如 pwsh.exe -Command Get-Command 命令時,明確指定 -c-Command
  • pwsh接受-i(或-Interactive)切換以表示互動式殼層。 這可讓 PowerShell 在 Unix 平台上作為預設殼層使用。
  • 已從 pwsh.exe移除參數-ImportSystemModules-PSConsoleFile
  • 已更改 pwsh -Version 以及 pwsh.exe 的內建說明,以符合其他原生工具。
  • -File-Command 的無效參數錯誤訊息以及結束碼符合 Unix 標準。
  • 已在 Windows 上新增 -WindowStyle 參數。 同樣地,非 Windows 平臺上的套件型安裝更新是就地更新。

縮短的名稱也與非 Windows 平臺的 shell 命名方式一致。

支援使用 bool 參數執行 PowerShell 腳本

先前,使用 pwsh.exe 來執行 PowerShell 腳本時,無法提供傳遞 $true/$false 做為參數值的方式。-File 已新增對 $true/$false 參數剖析值的支援。 同樣支援開關值。

已改善與 Windows PowerShell 的向後相容性

針對 Windows,新的開關參數 UseWindowsPowerShell 會新增至 Import-Module。 此開關會在 PowerShell 7 中建立代理模組,該模組會使用本機 Windows PowerShell 程序隱含地執行該模組中包含的任何 Cmdlet。 如需詳細資訊,請參閱 Import-Module

如需哪些Microsoft模組搭配PowerShell 7.0使用的詳細資訊,請參閱 模組相容性數據表

Microsoft 更新對 Windows 的支援

PowerShell 7.2 已新增對 Microsoft Update 的支援。 當您啟用這項功能時,您會在傳統 Windows Update (WU) 管理流程中取得最新的 PowerShell 7 更新,無論是使用商務用 Windows Update、WSUS、SCCM,還是 [設定] 中的互動式 WU 對話框。

PowerShell 7.2 MSI 套件包含下列命令行選項:

  • USE_MU - 此屬性有兩個可能的值:
    • 1 (預設值) - 選擇透過 Microsoft Update 或 WSUS 進行更新
    • 0 - 請勿選擇透過 Microsoft Update 或 WSUS 進行更新
  • ENABLE_MU
    • 1 (預設值) - 選擇使用 Microsoft Update、Automatic Updates 或 Windows Update
    • 0 - 請勿選擇啟用 Microsoft 更新自動更新或 Windows Update

引擎變更

支援 PowerShell 作為預設的 Unix 指令介面

在 Unix 上,殼層通常遵循接受 -i 作為啟動互動式殼層的慣例,許多工具也預期這種行為(例如,當將 PowerShell 設為預設殼層時),並會用 -i 參數來呼叫殼層。 這項變更造成中斷,因為-i先前可以用作-InputFormat的簡寫,現在必須使用-in

自訂插件

PowerShell 嵌入式管理單元 是 PowerShell 模組的前身,在 PowerShell 社群中並未廣泛採用。

由於支援嵌入式管理單元的複雜度及其在社群中的使用量不足,我們不再支援PowerShell中的自定義嵌入式管理單元。

實驗性功能旗標

PowerShell 6.2 啟用了對實驗功能的支援。 這可讓PowerShell開發人員在設計完成之前提供新功能並取得意見反應。 如此一來,我們便避免在設計發展時進行重大變更。

使用 Get-ExperimentalFeature 來取得可用實驗性功能的清單。 您可以使用Enable-ExperimentalFeatureDisable-ExperimentalFeature開啟或停用這些功能。

先從模組基底路徑載入元件,再嘗試從 GAC 載入

先前,當二進位模組在 GAC 中具有模組元件時,我們會先從 GAC 載入元件,再嘗試從模組基底路徑載入元件。

略過對於具有值類型元素類型的集合的 null 元素檢查

針對 Mandatory 參數和 ValidateNotNullValidateNotNullOrEmpty 屬性,如果集合的元素類型是值類型,請跳過 null 元素檢查。

保留 $?ParenExpressionSubExpressionArrayExpression

此 PR 會改變我們編譯子樞紐 (...)、子運算式 $(...) 和數組運算式 @() 的方式,因為 $? 不會自動為 true。 相反地,$? 的值取決於管線或語句執行的結果。

修正 $? 以避免在原生命令寫入 stderr 時成為 $false

$? 不會在原生命令寫入 stderr 時設為 $false。 原生命令通常會寫入stderr,而無意指示失敗。 $? 只有在原生命令有非零結束代碼時,才會設定為 $false

製作 $ErrorActionPreference 不會影響 stderr 原生命令的輸出

原生命令通常會寫入, stderr 而不打算指出失敗。 有了這項變更,stderr 的輸出仍然會被擷取到 ErrorRecord 物件中,但如果 ErrorRecord 是由原生命令產生的,運行時就不會再應用 $ErrorActionPreference

變更 $OutputEncoding 為使用 UTF-8 NoBOM 編碼,而不是 ASCII

先前的編碼 ASCII (7 位),在某些情況下會導致輸出的改變不正確。 讓 UTF-8 NoBOM 成為預設可以保留 Unicode 輸出,並使用大多數工具和作業系統支援的編碼。

將 Cmdlet 與參數 -Encoding 統一為 類型 System.Text.Encoding

-EncodingByte已從 FileSystem 提供者的命令工具中移除。 新的參數 -AsByteStream現在用來指定位元組數據流作為輸入,或輸出是位元組數據流。

在非 Windows 平臺上將編碼變更New-ModuleManifestUTF8NoBOM

先前,New-ModuleManifest 在 UTF-16 中使用 BOM 建立 psd1 指令清單,對 Linux 工具造成問題。 這項重大變更會將 非 Windows 平臺中的 編碼 New-ModuleManifest 變更為 UTF (無 BOM)。

從大部分的預設別名中移除AllScope

若要加速範圍建立, AllScope 已從大部分的默認別名中移除。 AllScope 保留了一些常用別名,以提高查找速度。

-Verbose-Debug 不再覆寫 $ErrorActionPreference

先前,如果指定 -Verbose-Debug,則會覆蓋 $ErrorActionPreference 的行為。 透過這項變更,-Verbose-Debug 不再影響 $ErrorActionPreference 的行為。

此外,參數會將 -Debug 設定 $DebugPreference[繼續] 而非 [查詢]。

持續 $PSCulture 反映會話中的文化特性變更

在 Windows PowerShell 中,目前的文化設定值會被快取,這可能導致值在會話啟動後變更時與文化設定不同步。 PowerShell Core 中已修正此快取行為。

允許明確指定的具名參數優先於從哈希表解構出的相同參數使用。

透過這項變更,來自 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

語言變更

Null 合併運算子 ??

null 聯合運算子 ?? 如果不是 Null,則會傳回其左側作數的值。 否則,它會評估右側運算元,並傳回其結果。 當左側操作數的計算結果為非 Null 時,?? 運算符不會計算其右側操作數。

$x = $null
$x ?? 100
100

在下列範例中,右運算元將不被評估。

[string] $todaysDate = '1/10/2020'
$todaysDate ?? (Get-Date).ToShortDateString()
1/10/2020

空值合併指派運算符 ??=

null 合併指派運算子 ??= 僅在左運算元評估為 null 時,才會將右運算元的值指派給左運算元。 當左側操作數的計算結果為非 Null 時,??= 運算符不會計算其右側操作數。

$x = $null
$x ??= 100
$x
100

在下列範例中,右側的運算元將不會被評估。

[string] $todaysDate = '1/10/2020'
$todaysDate ??= (Get-Date).ToShortDateString()
1/10/2020

空值條件運算符

注意

此功能已從實驗性移至 PowerShell 7.1 中的主流。

Null-conditional 運算子只有在運算元評估為非 Null 時,才會將成員存取、?.或物件存取 ?[]套用至其運算元,否則會傳回 null。

由於 PowerShell 允許 ? 成為變數名稱的一部分,因此使用這些運算元需要變數名稱的正式規格。 因此,必須在變數名稱,如 ${a}?,或當${a?}是變數名稱的一部分時,使用{}

在下列範例中,會傳回 PropName 的值。

$a = @{ PropName = 100 }
${a}?.PropName
100

下列範例會傳回 null,而不嘗試存取成員名稱 PropName

$a = $null
${a}?.PropName

同樣地,將會傳回元素的值。

$a = 1..10
${a}?[0]
1

當運算元為 null 時,元素不會被存取,並且會返回 null。

$a = $null
${a}?[0]

注意

${<name>} 變數名稱語法不應與 $() subexpression 運算子混淆。 如需詳細資訊,請參閱 about_Variables的變數名稱一節。

已新增 & 作業控制的運算符

& 放在管線結尾會使管線以 PowerShell 作業的形式執行。 當管線背景時,會傳回作業物件。 管線以作業的形式執行之後,可以使用所有標準 *-Job cmdlet 來管理作業。 管線中使用的變數(忽略行程特定變數)會自動複製到作業,因此 Copy-Item $foo $bar & 正常運作。 作業也會在目前目錄中執行,而不是使用者的主目錄。

新的方法/屬性 PSCustomObject

我們已將新的方法和屬性新增至 PSCustomObjectPSCustomObject 現在包含 Count/Length 與其他物件一樣的屬性。

$PSCustomObject = [pscustomobject]@{foo = 1}

$PSCustomObject.Length
1
$PSCustomObject.Count
1

這項工作也包含 ForEachWhere 方法,可讓您對 PSCustomObject 項目進行運作和篩選:

$PSCustomObject.ForEach({$_.foo + 1})
2
$PSCustomObject.Where({$_.foo -gt 0})
foo
---
  1

將 PSMethod 轉換為委託

您可以將 PSMethod 轉換成委派。 這可讓您執行像是將 委派值傳遞 PSMethod[M]::DoubleStrLen[M]::AggregateString之類的動作:

class M {
    static [int] DoubleStrLen([string] $value) { return 2 * $value.Length }

    static [long] AggregateString([string[]] $values, [Func[string, int]] $selector) {
        [long] $res = 0
        foreach($s in $values){
            $res += $selector.Invoke($s)
        }
        return $res
    }
}

[M]::AggregateString((gci).Name, [M]::DoubleStrLen)

PowerShell 7.1 中變更字串比較行為

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

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

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

# Escape sequence "`a" is Ctrl-G or [char]7
'Food' -eq "Foo`ad"
True

新的 Cmdlet

新增 Get-Uptime Cmdlet

Get-Uptime Cmdlet 會傳回自作系統上次開機後經過的時間。 Cmdlet 已在 PowerShell 6.0 中引進。

新增 Remove-Alias Cmdlet

Remove-Alias Cmdlet 會從目前的 PowerShell 會話中移除別名。 Cmdlet 已在 PowerShell 6.0 中引進。

新的 Cmdlet Remove-Service

Remove-Service Cmdlet 會移除登錄和服務資料庫中的 Windows 服務。 Remove-Service Cmdlet 是在 PowerShell 6.0 中引進的。

新的 Markdown 命令小程序

Markdown 是建立可讀取的純文本文件的標準,其基本格式可轉譯為 HTML。

PowerShell 6.1 已新增下列 Cmdlet:

新增 Test-Json Cmdlet

Test-Json Cmdlet 會測試字串是否為有效的 JavaScript 物件表示法 (JSON) 檔,並可選擇性地根據提供的架構驗證 JSON 檔。

此 Cmdlet 已在 PowerShell 6.1 中引進

支援實驗性功能的新指令小程式

PowerShell 6.2 已新增下列 Cmdlet 以支持實驗性功能。

新增 Join-String Cmdlet

Join-String Cmdlet 會將管線中的對象合併成單一字串。 此 Cmdlet 已在 PowerShell 6.2 中新增。

新的檢視 ConciseView 和 Cmdlet Get-Error

PowerShell 7.0 會增強錯誤訊息的顯示,以使用新的默認檢視 ,精簡檢視來改善互動式和腳本錯誤的可讀性。 檢視可透過喜好設定變數 $ErrorView選取。

使用 ConciseView 時,如果錯誤不是來自腳本或剖析器錯誤,則為單行錯誤訊息:

Get-ChildItem -Path C:\NotReal
Get-ChildItem: Cannot find path 'C:\NotReal' because it does not exist

如果在腳本執行期間發生錯誤,或是剖析錯誤,PowerShell 會傳回多行錯誤訊息,其中包含錯誤、指標,以及顯示錯誤所在位置的錯誤訊息。 如果終端機不支援 ANSI 色彩逸出序列 (VT100),則不會顯示色彩。

PowerShell 7 中的預設檢視是 ConciseView。 先前的默認檢視是 NormalView ,您可以藉由設定喜好設定變數 $ErrorView來選取此檢視。

$ErrorView = 'NormalView' # Sets the error view to NormalView
$ErrorView = 'ConciseView' # Sets the error view to ConciseView

注意

新增 ErrorAccentColor$Host.PrivateData 屬性以支援變更錯誤訊息的輔色。

新的 Get-Errorcmdlet 可在需要時提供完整資格錯誤的詳細檢視。 根據預設,Cmdlet 會顯示上次發生錯誤的完整詳細數據,包括內部例外狀況。

Cmdlet Get-Error 支援使用內建變數 $Error的管線輸入。 Get-Error 會顯示管道中的所有錯誤。

$Error | Get-Error

Cmdlet Get-Error 支援 Newest 參數,可讓您指定所要顯示目前工作階段的錯誤數目。

Get-Error -Newest 3 # Displays the lst three errors that occurred in the session

如需詳細資訊,請參閱 Get-Error

Cmdlet 變更

已將平行執行新增至 ForEach-Object

從 PowerShell 7.0 開始,ForEach-Object cmdlet 在集合中反覆運算項目,現在具有內建的平行處理功能和新的 Parallel 參數。

根據預設,平行腳本區塊會使用啟動平行工作的呼叫端目前工作目錄。

此範例會從本機 Windows 電腦上的 5 個系統記錄擷取 50,000 個記錄專案。

$logNames = 'Security','Application','System','Windows PowerShell','Microsoft-Windows-Store/Operational'

$logEntries = $logNames | ForEach-Object -Parallel {
    Get-WinEvent -LogName $_ -MaxEvents 10000
} -ThrottleLimit 5

$logEntries.Count

50000

Parallel 參數會指定針對每個輸入記錄檔名稱平行執行的腳本區塊。

新的 ThrottleLimit 參數會限制在指定時間平行執行的腳本區塊數目。 預設值為 5。

$_使用變數來代表腳本區塊中的目前輸入物件。 Using:使用範圍修飾詞,將變數參考傳遞至執行中的腳本區塊。

如需詳細資訊,請參閱 ForEach-Object

檢查 system32 Windows 上是否有相容的內建模組

在 Windows 10 1809 更新和 Windows Server 2019 中,我們更新了許多內建 PowerShell 模組,將它們標示為與 PowerShell 相容。

當 PowerShell 啟動時,它會自動將 $windir\System32 作為環境變數 PSModulePath 的一部分。 不過,只有在其 CompatiblePSEdition 標示為與 Core 相容時,它才會將模組暴露給 Get-ModuleImport-Module

您可以覆寫此行為,以使用 -SkipEditionCheck switch 參數顯示所有模組。 我們也已將新增一個PSEdition屬性到數據表輸出。

-lp 所有 -LiteralPath 參數的別名

我們已為所有具有-LiteralPath參數的內建 PowerShell Cmdlet 建立標準參數別名-lp

a*b 實際上不存在,則修正 Get-Item -LiteralPath a*b 以回傳錯誤。

先前,給定一個通配符時,-LiteralPath 會將它與 -Path 視為相同,如果通配符找不到任何檔案,則會在沒有任何通知的情況下結束。 正確的行為應該是將 -LiteralPath 視為字面上的內容,因此如果檔案不存在,就應該出錯。 變更是將 與搭配使用的 -Literal 通配符視為常值。

將工作目錄設定為 Start-Job 中的當前目錄

Cmdlet Start-Job 現在會使用目前目錄作為新作業的工作目錄。

*-Computer Cmdlet 移除-Protocol

由於 CoreFX 中的 RPC 遠端處理問題(特別是在非 Windows 平台上),為確保 PowerShell 的遠端處理體驗一致,-Protocol 參數已從 \*-Computer 指令程式中移除。 DCOM 的遠端功能不再被支援。 下列 Cmdlet 僅支援 WSMAN 遠端管理:

  • Rename-Computer
  • Restart-Computer
  • Stop-Computer

*-Service Cmdlet 移除 -ComputerName

為了鼓勵 PSRP 的一致性使用,-ComputerName 參數已從 *-Service cmdlet 中移除。

修正 Get-Content -Delimiter ,不要在傳回的行中包含分隔符

先前,使用 Get-Content -Delimiter 時的輸出不一致且不方便,因為它需要進一步處理數據以移除分隔符。 這項變更會移除傳回行中的分隔符。

Format-Hex 的變更

參數 -Raw 現在是 「no-op」 (因為它不會執行任何動作)。 未來所有輸出將會顯示其類型的所有位元組,並以數字真實表示。 這是 -Raw 參數在此變更之前執行的動作。

Get-ComputerInfo 屬性名稱中的錯字修正

BiosSerialNumber 拼字錯誤, BiosSeralNumber 並已變更為正確的拼字。

新增 Get-StringHashGet-FileHash Cmdlet

這項變更是 CoreFX 不支援某些哈希演算法,因此不再提供這些演算法:

  • MACTripleDES
  • RIPEMD160

在傳遞$null傳回所有物件而非錯誤的 Cmdlet 上 Get-* 新增驗證

傳遞 $null 至下列任一項現在會引發錯誤:

  • Get-Credential -UserName
  • Get-Event -SourceIdentifier
  • Get-EventSubscriber -SourceIdentifier
  • Get-Help -Name
  • Get-PSBreakpoint -Script
  • Get-PSProvider -PSProvider
  • Get-PSSessionConfiguration -Name
  • Get-Runspace -Name
  • Get-RunspaceDebug -RunspaceName
  • Get-Service -Name
  • Get-TraceSource -Name
  • Get-Variable -Name

新增對 W3C 擴充記錄檔格式的支援在 Import-Csv

之前, Import-Csv Cmdlet 無法用來直接匯入 W3C 擴充記錄格式的記錄檔,而且需要其他動作。 這項變更支援 W3C 擴充記錄格式。

當 CSV 中存在類型資訊時,Import-Csv 會在匯入中套用 pstypenames

先前,使用 Export-Csv 搭配 TypeInformation 導出,並用 ConvertFrom-Csv 匯入的物件不會保留類型資訊。 當 CSV 檔案中有提供時,這項變更將類型資訊新增至 pstypenames 成員。

-NoTypeInformationExport-Csv上是預設設置

之前, Export-Csv Cmdlet 會將批註輸出為包含物件類型名稱的第一行。 變更預設會排除類型資訊,因為大部分 CSV 工具都無法瞭解。 已進行這項變更,以解決客戶的意見反應。

使用 -IncludeTypeInformation 來保留先前的行為。

允許在註冊表路徑中使用* 以作為Remove-Item

先前,-LiteralPath 會將通配符視為和 -Path 相同,且如果通配符未找到任何檔案,則會靜默結束。 正確的行為應該是 -LiteralPath 是字面上的值,所以如果檔案不存在,應該會報錯。 將變更為把與 -Literal 搭配使用的通配符視為常值。

Group-Object 現在會排序群組

作為效能改善的一部分, Group-Object 現在會傳回群組的排序列表。 雖然您不應該依賴順序,但如果您想要第一個群組,可能會因為這項變更而受到影響。 我們決定這項效能改善值得變更,因為依賴先前行為的影響很低。

Measure-Object 中的標準偏差

現在的 Measure-Object 輸出會包含 StandardDeviation 屬性。

Get-Process | Measure-Object -Property CPU -AllStats
Count             : 308
Average           : 31.3720576298701
Sum               : 9662.59375
Maximum           : 4416.046875
Minimum           :
StandardDeviation : 264.389544720926
Property          : CPU

Get-PfxCertificate -Password

Get-PfxCertificate 現在具有 Password 參數,並接受 SecureString。 這可讓您以非互動方式使用它:

$certFile = '\\server\share\pwd-protected.pfx'
$certPass = Read-Host -AsSecureString -Prompt 'Enter the password for certificate: '

$certThumbPrint = (Get-PfxCertificate -FilePath $certFile -Password $certPass ).ThumbPrint

移除more函式

過去,PowerShell 在 Windows 上提供一個函式,稱為 more ,該函式包裝了 more.com。 該函式現已移除。

此外,函式 help 已變更為在 Windows 上使用 more.com,或在非 Windows 平台上使用 $Env:PAGER 指定的系統預設分頁器。

cd DriveName: 現在會將用戶傳回該磁碟驅動器中目前的工作目錄

先前,使用 Set-Locationcd 返回 PSDrive,將用戶傳送至該磁碟驅動器的預設位置。 用戶現在會被導引至該會話中最後一個已知的當前工作目錄。

cd - 傳回至上一個目錄

C:\Windows\System32> cd C:\
C:\> cd -
C:\Windows\System32>

或在 Linux 上:

PS /etc> cd /usr/bin
PS /usr/bin> cd -
PS /etc>

此外,cdcd -- 變更為 $HOME

Update-Help 作為非系統管理員

根據熱門需求, Update-Help 不再需要以系統管理員身分執行。 Update-Help 現在預設會儲存使用者範圍資料夾的說明。

Where-Object -Not

在將-Not參數新增至Where-Object後,可以在管線中篩選物件,以篩出屬性不存在或屬性值為Null/空白的物件。

例如,此命令會傳回未定義任何相依服務的所有服務:

Get-Service | Where-Object -Not DependentServices

Web Cmdlet 的變更

Web Cmdlet 的基礎 .NET API 已變更為 System.Net.Http.HttpClient。 這項變更提供許多優點。 不過,這項變更以及與 Internet Explorer 相容性不足,導致在Invoke-WebRequestInvoke-RestMethod內的數個中斷性變更。

  • Invoke-WebRequest 現在僅支援基本 HTML 剖析。 Invoke-WebRequest 一律會傳 BasicHtmlWebResponseObject 回物件。 ParsedHtmlForms 屬性已移除。
  • BasicHtmlWebResponseObject.Headers 值現在 String[] 不是 String
  • BasicHtmlWebResponseObject.BaseResponse 現在是 System.Net.Http.HttpResponseMessage 物件。
  • Web Cmdlet 例外狀況中的 Response 屬性現在是 System.Net.Http.HttpResponseMessage 物件。
  • 嚴格的 RFC 標頭解析現在默認為 -Headers-UserAgent 參數。 這可以用 -SkipHeaderValidation 繞過。
  • file://ftp:// URI 方案不再被支持。
  • System.Net.ServicePointManager 設定已不再有效。
  • macOS 目前沒有可用的憑證式驗證。
  • 使用 -Credential 取代 http:// URI 會導致錯誤。 使用https:// URI 或提供-AllowUnencryptedAuthentication 參數來抑制錯誤。
  • -MaximumRedirection 現在會在重新導向嘗試超過提供的限制時產生終止錯誤,而不是傳回上次重新導向的結果。
  • 在 PowerShell 6.2 中,將預設 JSON 回應的編碼更改為 UTF-8。 當 JSON 回應未提供字元集時,預設的編碼應該根據 RFC 8259 使用 UTF-8。
  • 回應預設編碼設定為 UTF-8 application-json
  • 已新增 -SkipHeaderValidation 參數以允許 Content-Type 不符合標準規範的標頭
  • 已新增 -Form 參數以支援簡化 multipart/form-data 的支援
  • 符合規範的、不區分大小寫的關聯鍵處理
  • 已新增 -Resume Web Cmdlet 的參數

當未傳回任何數據時,Invoke-RestMethod 會傳回有用的資訊

當 API 只 null傳回 時, Invoke-RestMethod 會將這個 串行化為字串 "null" ,而不是 $null。 這項變更會修正 Invoke-RestMethod 中的邏輯,將有效的單一值 JSON null 文字正確序列化為 $null

Web Cmdlet 指令集會在資料透過未加密連線傳送時發出-Credential警告。

使用 HTTP 時,包含密碼的內容會以純文字傳送。 這項變更預設不允許此變更,如果認證傳遞不安全,則傳回錯誤。 用戶可以使用 -AllowUnencryptedAuthentication 開關略過此切換。

-OutFile Web Cmdlet 中的參數運作如下 -LiteralPath

從 PowerShell 7.1 開始,Web Cmdlet 的 OutFile 參數會像 LiteralPath 一樣運作,而且不會處理通配符。

API 變更

移除 AddTypeCommandBase 類別

類別 AddTypeCommandBase 已從 Add-Type 中移除,以改善效能。 此類別僅供 Add-Type Cmdlet 使用,且不應影響使用者。

已將 VisualBasic 從 Add-Type 中移除作為支持的語言

在過去,您可以使用 Cmdlet 編譯 Visual Basic 程式代碼 Add-Type 。 Visual Basic 很少用於 Add-Type。 我們已移除這項功能,以減少PowerShell的大小。

已移除 RunspaceConfiguration 支援

先前,使用 API 以程式設計方式建立 PowerShell Runspace 時,您可以使用舊版 RunspaceConfiguration 或較 InitialSessionState 新的類別。 這項變更已移除 對 RunspaceConfiguration 的支援,且僅支援 InitialSessionState

CommandInvocationIntrinsics.InvokeScript 將自變數系結至 $input 而非 $args

參數的位置不正確,導致args傳遞為輸入,而不是做為自變數。

移除$PSVersionTable中的ClrVersionBuildVersion屬性

ClrVersion$PSVersionTable 屬性不適用於 CoreCLR。 終端使用者不應該使用該值來判斷相容性。

屬性 BuildVersion 已系結至非 Windows 平台上無法使用的 Windows 組建版本。 GitCommitId使用 屬性來擷取 PowerShell 的確切組建版本。

實作 Unicode 轉義解析

`u#### `u{####} 會轉換成對應的 Unicode 字元。 若要輸出常值 `u,請跳脫反引號: ``u

PS 函式中的參數係結問題 ValueFromRemainingArguments

ValueFromRemainingArguments 現在會將值當做陣列傳回,而不是本身為陣列的單一值。

整理了 CommandTypes.WorkflowWorkflowInfoCleaned 的用法

清除與 System.Management.Automation 中使用 CommandTypes.WorkflowWorkflowInfo 相關的程式代碼。

這些輕微的破壞性變更主要會影響協助提供者程式碼。

  • WorkflowInfo 的公用建構函式變更為內部的。 我們不再支援工作流程,因此不允許人員建立 Workflow 實例是合理的。
  • 拿掉 System.Management.Automation.DebugSource 類型,因為它僅用於工作流程偵錯。
  • 從僅用於工作流程偵錯的抽象類別 Debugger 中移除多載SetParent
  • 從衍生類別 RemotingJobDebugger 中移除 相同的 多載SetParent

在將 ScriptBlock 轉換成委派時,請勿將傳回結果封裝在 PSObject 中。

ScriptBlock 轉換成要用於 "C#" 內容的委派型別時,將結果包裝在 PSObject 中會帶來不必要的麻煩:

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

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

遠程支援

在 Unix 平臺上使用 WinRM 的 PowerShell 遠端處理需要使用 NTLM/Negotiate 或透過 HTTPS 的基本身份驗證。 macOS 上的 PSRP 僅支援透過 HTTPS 進行基本身份驗證。 非 Windows 平台不支援 Kerberos 型驗證。

PowerShell 也支援在所有平台上透過 SSH 的 PowerShell 遠端處理 (PSRP) (Windows、macOS 和 Linux)。 如需詳細資訊,請參閱 PowerShell 中的SSH 遠端管理。

** 容器專用的 PowerShell Direct 會先嘗試使用 pwsh

PowerShell Direct 是 PowerShell 和 Hyper-V 的功能,可讓您連線到 Hyper-V VM 或容器,而不需要網路連線或其他遠端管理服務。

在過去,PowerShell Direct 會使用容器上的內建 Windows PowerShell 實例進行連線。 現在,PowerShell Direct 會先嘗試使用任何可用的 pwsh.exePATH 環境變數中進行連線。 如果 pwsh.exe 無法使用,PowerShell Direct 會回復為使用 powershell.exe

Enable-PSRemoting 現在會為預覽版本建立個別的遠端端點

Enable-PSRemoting 現在會建立兩個遠端會話組態:

  • PowerShell 主要版本的其中一個版本號。 例如: PowerShell.6 。 此端點可在次要版本更新中作為「全系統」PowerShell 6 的可信賴會話設定。
  • 一個版本特定的會話組態,例如: PowerShell.6.1.0

如果您想要在同一部計算機上安裝並存取多個 PowerShell 6 版本,此行為非常有用。

此外,執行 Enable-PSRemoting Cmdlet 之後,PowerShell 的預覽版本現在會取得它們自己的遠端會話設定:

C:\WINDOWS\system32> Enable-PSRemoting

如果您之前尚未設定 WinRM,您的輸出可能會有所不同。

WinRM is already set up to receive requests on this computer.
WinRM is already set up for remote management on this computer.

然後,您可以針對 PowerShell 6 的預覽和穩定組建,以及每個特定版本看到個別的 PowerShell 會話組態。

Get-PSSessionConfiguration
Name          : PowerShell.6.2-preview.1
PSVersion     : 6.2
StartupScript :
RunAsUser     :
Permission    : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed

Name          : PowerShell.6-preview
PSVersion     : 6.2
StartupScript :
RunAsUser     :
Permission    : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed

Name          : powershell.6
PSVersion     : 6.1
StartupScript :
RunAsUser     :
Permission    : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed

Name          : powershell.6.1.0
PSVersion     : 6.1
StartupScript :
RunAsUser     :
Permission    : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed

user@host:port SSH 支援的語法

SSH 用戶端通常支援 格式 user@host:port的連接字串。 透過新增 SSH 作為 PowerShell 遠端通訊協定,我們已新增此連接字串格式的支援:

Enter-PSSession -HostName fooUser@ssh.contoso.com:2222

只能使用環境變數停用遙測

PowerShell 會在啟動時,將基本遙測數據傳送至Microsoft。 數據報含OS名稱、OS 版本和PowerShell版本。 此數據可讓我們進一步瞭解使用PowerShell的環境,並讓我們設定新功能和修正的優先順序。

若要離開此遙測,請將環境變數 POWERSHELL_TELEMETRY_OPTOUT 設定為 trueyes1。 我們不再支援刪除檔案 DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY 以停用遙測。