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 之間的 PowerShell 語言有幾個差異。 最顯著的差異在於 Windows 與非 Windows 平台之間 PowerShell Cmdlet 的可用性和行為,以及 .NET Framework 與 .NET Core 之間差異造成的變更。

本文摘要說明 Windows PowerShell 與目前 PowerShell 版本之間的重大差異和重大變更。 此摘要不包含已新增的新功能或 Cmdlet。 本文也不會討論版本之間的變更。 本文的目標是要呈現 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 方法時。 此外,建構函式可能會有新的多載。 這可能會影響您使用 或 [type]::new() 方法建立物件New-Object的方式。

例如,.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 的 Cmdlet (WPF)

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

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

PowerShell Desired 狀態設定 (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 的並存安裝。

powershell.exe進行的其他變更pwsh(.exe)

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

縮短的名稱也與非 Windows 平臺上的殼層命名一致。

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

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

已改善與 Windows PowerShell 的回溯相容性

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

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

Windows 的 Microsoft Update 支援

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 自動 更新 或 Windows Update
    • 0- 請勿選擇使用 Microsoft Update 自動 更新 或 Windows Update

引擎變更

支援 PowerShell 作為預設 Unix 殼層

在 Unix 上,殼層會接受 -i 互動式殼層的慣例,而且許多工具都預期此行為(script 例如,將 PowerShell 設定為預設殼層時),並使用 參數呼叫殼層 -i 。 這項變更在 中中斷, -i 先前可以用來做為短手來比 -inputformat對 ,現在必須是 -in

自定義嵌入式管理單元

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

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

實驗性功能旗標

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

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

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

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

略過 null 元素檢查具有實值型別項目類型的集合

Mandatory針對 參數和 ValidateNotNullValidateNotNullOrEmpty 屬性,請略過 null 元素檢查集合的元素類型是否為實值型別。

保留 $? ParenExpressionSubExpressionArrayExpression

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

修正 $? 為不在 $false 原生命令寫入時 stderr

$? 當原生命令寫入 時,不會設定 $falsestderr。 原生命令通常會寫入, 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已從文件系統提供者 Cmdlet 中移除。 新的參數 -AsByteStream現在用來指定位元組數據流作為輸入,或輸出是位元組數據流。

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

先前, New-ModuleManifest 使用 BOM 在 UTF-16 中建立 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 核心中已修正此快取行為。

允許明確指定具名參數,從哈希表展開取代相同的參數

透過這項變更,來自splatting的具名參數會移至參數清單的結尾,以便在所有明確指定的具名參數系結之後系結它們。 找不到指定的具名參數時,簡單函式的參數係結不會擲回錯誤。 未知的具名參數會系結至 $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

語言變更

Null 聯合運算符 ??

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

$x = $null
$x ?? 100
100

在下列範例中,將不會評估右側操作數。

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

Null 聯合指派運算符 ??=

Null 聯合指派運算符 ??= 只有在左側操作數評估為 null 時,才會將右操作數的值指派給其左側操作數。 如果左方運算元評估為非 Null,??= 運算子不會評估其右方運算元。

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

在下列範例中,將不會評估右側操作數。

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

Null 條件運算子

注意

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

Null 條件運算子只有在操作數評估為非 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 服務。 Cmdlet Remove-Service 已在 PowerShell 6.0 中引進。

新增 Markdown Cmdlet

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

PowerShell 6.1 已新增下列 Cmdlet:

新的 Test-Json Cmdlet

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

此 Cmdlet 已在 PowerShell 6.1 中引進

支持實驗性功能的新 Cmdlet

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

新增 Join-String Cmdlet

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

新的檢視精簡檢視和 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 一部分。 不過,它只會將模組公開至 Get-Module ,如果Import-Module模組標示為與 Core相容,則CompatiblePSEdition為 。

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

-lp 所有 -LiteralPath 參數的別名

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

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

先前, -LiteralPath 假設通配符會將其視為相同 -Path ,如果通配符找不到任何檔案,則會以無訊息方式結束。 正確的行為應該是常值, -LiteralPath 因此如果檔案不存在,它應該就會發生錯誤。 變更是將 與搭配使用的 -Literal 通配符視為常值。

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

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

*-Computer Cmdlet 移除-Protocol

由於 CoreFX 中的 RPC 遠端處理問題(特別是在非 Windows 平臺上),以及確保 PowerShell 中的一致遠端處理體驗, -Protocol 參數已從 \*-Computer Cmdlet 中移除。 遠端不再支援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 擴充記錄格式。

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

先前,使用 Export-CSV 匯入 ConvertFrom-CsvTypeInformation 導出的物件不會保留類型資訊。 這項變更會在 CSV 檔案中提供時,將類型資訊新增至 PSTypeNames 成員。

-NoTypeInformation 是預設值 Export-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 已變更為在 more.com Windows 上使用,或非 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>

此外, cd 並將 cd -- 變更為 $HOME

Update-Help 作為非系統管理員

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

Where-Object -Not

將 參數新增 -NotWhere-Object時,可以在管線篩選物件,以取得屬性不存在或 Null/空白屬性值。

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

Get-Service | Where-Object -Not DependentServices

Web Cmdlet 的變更

Web Cmdlet 的基礎 .NET API 已變更為 System.Net.Http.HttpClient。 這項變更提供許多優點。 不過,這項變更以及與 Internet Explorer 的互操作性缺乏,導致和Invoke-RestMethod內的Invoke-WebRequest數個中斷性變更。

  • Invoke-WebRequest 現在僅支援基本 HTML 剖析。 Invoke-WebRequest 一律會傳 BasicHtmlWebResponseObject 回物件。 ParsedHtmlForms 屬性已移除。
  • BasicHtmlWebResponseObject.Headers 值現在 String[] 不是 String
  • BasicHtmlWebResponseObject.BaseResponse 現在是 System.Net.Http.HttpResponseMessage 物件。
  • Response Web Cmdlet 例外狀況上的 屬性現在是 System.Net.Http.HttpResponseMessage 物件。
  • 嚴格的 RFC 標頭剖析現在預設為 -Headers-UserAgent 參數。 這可以使用 略過 -SkipHeaderValidation
  • file:// 不再支援 和 ftp:// URI 配置。
  • System.Net.ServicePointManager 不再接受設定。
  • macOS 目前沒有可用的憑證式驗證。
  • 透過 URI 使用 -Credentialhttp:// 會導致錯誤。 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 變更

Remove AddTypeCommandBase 類別

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

已移除 VisualBasic 為載入宏類型中支持的語言

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

已移除 RunspaceConfiguration 支援

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

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

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

從中移除 ClrVersionBuildVersion 屬性 $PSVersionTable

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

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

實作 Unicode 逸出剖析

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

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

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

清除和的 CommandTypes.Workflow 用法 WorkflowInfoCleaned

清除與 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 遠端處理 (PSRP)需要 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.exe 環境變數進行 PATH 連線。 如果 pwsh.exe 無法使用,PowerShell Direct 會回復為使用 powershell.exe

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

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

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

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

此外,執行 Cmdlet 之後 Enable-PSRemoting ,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 以停用遙測。