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 不同的方式。 如需版本與新增新功能之間的變更詳細討論,請參閱 每個版本的新功能 文章。
- PowerShell 7.5 的新功能
- PowerShell 7.4 的新功能
- PowerShell 7.3 的新功能
- PowerShell 7.2 的新功能
- PowerShell 7.1 的新功能
- PowerShell 7.0 的新功能
- PowerShell 6.x 的新功能
.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-WinEvent
和 New-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.ps1
或pwsh 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 Update0
- 請勿選擇使用 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
針對 參數和 ValidateNotNull
ValidateNotNullOrEmpty
屬性,請略過 null 元素檢查集合的元素類型是否為實值型別。
保留 $?
ParenExpression、SubExpression 和 ArrayExpression
此 PR 會改變我們編譯子樞紐 (...)
、子運算式 $(...)
和數位運算式 @()
的方式, $?
因此不會自動 為 true。 的值 $?
會視執行管線或語句的結果而定。
修正 $?
為不在 $false
原生命令寫入時 stderr
$?
當原生命令寫入 時,不會設定 $false
為 stderr
。 原生命令通常會寫入, 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
此值-Encoding
Byte
已從文件系統提供者 Cmdlet 中移除。 新的參數 -AsByteStream
現在用來指定位元組數據流作為輸入,或輸出是位元組數據流。
在非 Windows 平臺上將編碼變更New-ModuleManifest
為UTF8NoBOM
先前, 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
我們已將新的方法和屬性新增至 PSCustomObject
。 PSCustomObject
現在包含 Count
/Length
與其他物件一樣的屬性。
$PSCustomObject = [pscustomobject]@{foo = 1}
$PSCustomObject.Length
1
$PSCustomObject.Count
1
這項工作也包含 ForEach
和 Where
方法,可讓您操作和篩選 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:
- ConvertFrom-Markdown - 將字串或檔案的內容轉換為 MarkdownInfo 物件。
- Get-MarkdownOption - 傳回用於在控制台中轉譯 Markdown 內容的目前色彩和樣式。
- Set-MarkdownOption - 設定用於在控制台中轉譯 Markdown 內容的色彩和樣式。
- Show-Markdown - 在控制台或 HTML 中顯示 Markdown 內容
新的 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-Error
Cmdlet 會視需要提供完整錯誤的完整詳細檢視。 根據預設,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-StringHash
和 Get-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-Csv
PSTypeNames
當 CSV 中存在類型資訊時,會套用至匯入
先前,使用 Export-CSV
匯入 ConvertFrom-Csv
和 TypeInformation
導出的物件不會保留類型資訊。 這項變更會在 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-Location
或 cd
返回 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
將 參數新增 -Not
至 Where-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
回物件。ParsedHtml
和Forms
屬性已移除。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 使用
-Credential
http://
會導致錯誤。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傳遞為輸入,而不是做為自變數。
從中移除 ClrVersion
和 BuildVersion
屬性 $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.Workflow
和 WorkflowInfo
相關的程式代碼。
這些輕微的重大變更主要會影響協助提供者程序代碼。
- 將的
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
設定為 true
、 yes
或 1
。 我們不再支援刪除檔案 DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY
以停用遙測。