訓練
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 不同的方式。 如需版本與新增新功能之間的變更詳細討論,請參閱每個版本的 新功能 文章。
- PowerShell 7.5 的新功能
- PowerShell 7.4 新功能介紹
- PowerShell 7.3 的新功能
- PowerShell 7.2 的新功能
- PowerShell 7.1 的新功能
- PowerShell 7.0 的新功能
- PowerShell 6.x 的新功能
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 方法變更並非 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 不再包含下列模組。
- ISE
- Microsoft.PowerShell.LocalAccounts
- Microsoft.PowerShell.ODataUtils
- Microsoft.PowerShell.Operation.Validation
- PSScheduledJob (排程工作)
- PSWorkflow
- PSWorkflowUtility
PowerShell 工作流程 是 Windows PowerShell 中的一項功能,建置在 Windows Workflow Foundation (WF) 之上, 可針對長時間執行或平行處理的工作建立健全的 Runbook。
由於 .NET Core 中缺少 Windows Workflow Foundation 的支持,我們已從 PowerShell 移除 PowerShell 工作流程。
未來,我們想要在PowerShell語言中啟用原生平行處理原則/並行,而不需要PowerShell工作流程。
如果需要在 OS 重新啟動之後使用檢查點繼續腳本,建議您使用工作排程器在 OS 啟動時執行腳本,但腳本必須維持自己的狀態(例如將它保存至檔案)。
針對 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 已從 PowerShell 中移除:
Register-WmiEvent
Set-WmiInstance
Invoke-WmiMethod
Get-WmiObject
Remove-WmiObject
CimCmdlet 模組 (也稱為 WMI v2) Cmdlet 會執行相同的函式,並提供新功能和重新設計的語法。
.NET Core 不支援使用 SOAP 通訊協定的 Windows Communication Framework。 此 Cmdlet 已移除,因為它需要SOAP。
這些 Cmdlet 的使用非常有限。 決定停止支持他們。
Complete-Transaction
Get-Transaction
Start-Transaction
Undo-Transaction
Use-Transaction
由於使用不支援的 API,Cmdlet *-EventLog
已從 PowerShell 中移除。
Get-WinEvent
和 New-WinEvent
可在 Windows 上取得和建立事件。
.NET Core 3.1 新增了 WPF 的支援,因此 PowerShell 7.0 版本還原了下列 Windows 特定功能:
- Cmdlet
Show-Command
- Cmdlet
Out-GridView
-
ShowWindow 參數
Get-Help
Invoke-DscResource
已在 PowerShell 7.0 中還原為實驗性功能。
從 PowerShell 7.2 開始,PSDesiredStateConfiguration 模組已從 PowerShell 中移除,並已發佈至 PowerShell 資源庫。 如需詳細資訊,請參閱PowerShell小組部落格中的 公告 。
PowerShell 的二進位名稱已從 powershell(.exe)
變更為 pwsh(.exe)
。 這項變更提供決定性的方式,讓使用者在機器上執行 PowerShell,並支援 Windows PowerShell 和 PowerShell 的並存安裝。
對pwsh(.exe)
的其他變更來自powershell.exe
:
- 將第一個位置參數從
-Command
變更為-File
。 這項變更修正#!
了在非 Windows 平臺上從非 PowerShell 殼層執行的 PowerShell 腳本中使用 (也稱為 shebang)。 這也表示您可以執行類似pwsh foo.ps1
或pwsh 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 命名方式一致。
先前,使用 pwsh.exe
來執行 PowerShell 腳本時,無法提供傳遞 $true
/$false
做為參數值的方式。-File
已新增對 $true
/$false
參數剖析值的支援。 同樣支援開關值。
針對 Windows,新的開關參數 UseWindowsPowerShell 會新增至 Import-Module
。 此開關會在 PowerShell 7 中建立代理模組,該模組會使用本機 Windows PowerShell 程序隱含地執行該模組中包含的任何 Cmdlet。 如需詳細資訊,請參閱 Import-Module。
如需哪些Microsoft模組搭配PowerShell 7.0使用的詳細資訊,請參閱 模組相容性數據表。
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
-
在 Unix 上,殼層通常遵循接受 -i
作為啟動互動式殼層的慣例,許多工具也預期這種行為(例如,當將 PowerShell 設為預設殼層時),並會用 -i
參數來呼叫殼層。 這項變更造成中斷,因為-i
先前可以用作-InputFormat
的簡寫,現在必須使用-in
。
PowerShell 嵌入式管理單元 是 PowerShell 模組的前身,在 PowerShell 社群中並未廣泛採用。
由於支援嵌入式管理單元的複雜度及其在社群中的使用量不足,我們不再支援PowerShell中的自定義嵌入式管理單元。
PowerShell 6.2 啟用了對實驗功能的支援。 這可讓PowerShell開發人員在設計完成之前提供新功能並取得意見反應。 如此一來,我們便避免在設計發展時進行重大變更。
使用 Get-ExperimentalFeature
來取得可用實驗性功能的清單。 您可以使用Enable-ExperimentalFeature
和Disable-ExperimentalFeature
開啟或停用這些功能。
先前,當二進位模組在 GAC 中具有模組元件時,我們會先從 GAC 載入元件,再嘗試從模組基底路徑載入元件。
針對 Mandatory
參數和 ValidateNotNull
、ValidateNotNullOrEmpty
屬性,如果集合的元素類型是值類型,請跳過 null 元素檢查。
此 PR 會改變我們編譯子樞紐 (...)
、子運算式 $(...)
和數組運算式 @()
的方式,因為 $?
不會自動為 true。 相反地,$?
的值取決於管線或語句執行的結果。
$?
不會在原生命令寫入 stderr
時設為 $false
。 原生命令通常會寫入stderr
,而無意指示失敗。
$?
只有在原生命令有非零結束代碼時,才會設定為 $false
。
原生命令通常會寫入, stderr
而不打算指出失敗。 有了這項變更,stderr
的輸出仍然會被擷取到 ErrorRecord 物件中,但如果 ErrorRecord 是由原生命令產生的,運行時就不會再應用 $ErrorActionPreference
。
先前的編碼 ASCII (7 位),在某些情況下會導致輸出的改變不正確。 讓 UTF-8 NoBOM
成為預設可以保留 Unicode 輸出,並使用大多數工具和作業系統支援的編碼。
-Encoding
值Byte
已從 FileSystem 提供者的命令工具中移除。 新的參數 -AsByteStream
現在用來指定位元組數據流作為輸入,或輸出是位元組數據流。
先前,New-ModuleManifest
在 UTF-16 中使用 BOM 建立 psd1
指令清單,對 Linux 工具造成問題。 這項重大變更會將 非 Windows 平臺中的 編碼 New-ModuleManifest
變更為 UTF (無 BOM)。
若要加速範圍建立, AllScope
已從大部分的默認別名中移除。
AllScope
保留了一些常用別名,以提高查找速度。
先前,如果指定 -Verbose
或 -Debug
,則會覆蓋 $ErrorActionPreference
的行為。 透過這項變更,-Verbose
和 -Debug
不再影響 $ErrorActionPreference
的行為。
此外,參數會將 -Debug
設定 $DebugPreference
為 [繼續] 而非 [查詢]。
在 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 時,??
運算符不會計算其右側操作數。
$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
。
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
[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 建置在 .NET 5.0 上,引進了下列重大變更:
從 .NET 5.0 起,文化特性不變字串比較會忽略非列印控制字元。
例如,下列兩個字串會視為相同:
# Escape sequence "`a" is Ctrl-G or [char]7
'Food' -eq "Foo`ad"
True
Get-Uptime Cmdlet 會傳回自作系統上次開機後經過的時間。 Cmdlet 已在 PowerShell 6.0 中引進。
Remove-Alias Cmdlet 會從目前的 PowerShell 會話中移除別名。 Cmdlet 已在 PowerShell 6.0 中引進。
Remove-Service Cmdlet 會移除登錄和服務資料庫中的 Windows 服務。
Remove-Service
Cmdlet 是在 PowerShell 6.0 中引進的。
Markdown 是建立可讀取的純文本文件的標準,其基本格式可轉譯為 HTML。
PowerShell 6.1 已新增下列 Cmdlet:
- ConvertFrom-Markdown - 將字串或檔案的內容轉換為 MarkdownInfo 物件。
- Get-MarkdownOption - 傳回用於在控制台中轉譯 Markdown 內容的目前色彩和樣式。
- Set-MarkdownOption - 設定用於在控制台中轉譯 Markdown 內容的色彩和樣式。
- Show-Markdown - 在控制台或 HTML 中顯示 Markdown 內容
Test-Json Cmdlet 會測試字串是否為有效的 JavaScript 物件表示法 (JSON) 檔,並可選擇性地根據提供的架構驗證 JSON 檔。
此 Cmdlet 已在 PowerShell 6.1 中引進
PowerShell 6.2 已新增下列 Cmdlet 以支持實驗性功能。
Join-String Cmdlet 會將管線中的對象合併成單一字串。 此 Cmdlet 已在 PowerShell 6.2 中新增。
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。
從 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。
在 Windows 10 1809 更新和 Windows Server 2019 中,我們更新了許多內建 PowerShell 模組,將它們標示為與 PowerShell 相容。
當 PowerShell 啟動時,它會自動將 $windir\System32
作為環境變數 PSModulePath
的一部分。 不過,只有在其 CompatiblePSEdition
標示為與 Core
相容時,它才會將模組暴露給 Get-Module
和 Import-Module
。
您可以覆寫此行為,以使用 -SkipEditionCheck
switch 參數顯示所有模組。
我們也已將新增一個PSEdition
屬性到數據表輸出。
我們已為所有具有-LiteralPath
參數的內建 PowerShell Cmdlet 建立標準參數別名-lp
。
先前,給定一個通配符時,-LiteralPath
會將它與 -Path
視為相同,如果通配符找不到任何檔案,則會在沒有任何通知的情況下結束。 正確的行為應該是將 -LiteralPath
視為字面上的內容,因此如果檔案不存在,就應該出錯。 變更是將 與搭配使用的 -Literal
通配符視為常值。
Cmdlet Start-Job
現在會使用目前目錄作為新作業的工作目錄。
由於 CoreFX 中的 RPC 遠端處理問題(特別是在非 Windows 平台上),為確保 PowerShell 的遠端處理體驗一致,-Protocol
參數已從 \*-Computer
指令程式中移除。 DCOM 的遠端功能不再被支援。 下列 Cmdlet 僅支援 WSMAN 遠端管理:
Rename-Computer
Restart-Computer
Stop-Computer
為了鼓勵 PSRP 的一致性使用,-ComputerName
參數已從 *-Service
cmdlet 中移除。
先前,使用 Get-Content -Delimiter
時的輸出不一致且不方便,因為它需要進一步處理數據以移除分隔符。 這項變更會移除傳回行中的分隔符。
參數 -Raw
現在是 「no-op」 (因為它不會執行任何動作)。 未來所有輸出將會顯示其類型的所有位元組,並以數字真實表示。 這是 -Raw
參數在此變更之前執行的動作。
BiosSerialNumber
拼字錯誤, BiosSeralNumber
並已變更為正確的拼字。
這項變更是 CoreFX 不支援某些哈希演算法,因此不再提供這些演算法:
MACTripleDES
RIPEMD160
傳遞 $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
之前, Import-Csv
Cmdlet 無法用來直接匯入 W3C 擴充記錄格式的記錄檔,而且需要其他動作。 這項變更支援 W3C 擴充記錄格式。
先前,使用 Export-Csv
搭配 TypeInformation
導出,並用 ConvertFrom-Csv
匯入的物件不會保留類型資訊。 當 CSV 檔案中有提供時,這項變更將類型資訊新增至 pstypenames
成員。
之前, Export-Csv
Cmdlet 會將批註輸出為包含物件類型名稱的第一行。 變更預設會排除類型資訊,因為大部分 CSV 工具都無法瞭解。 已進行這項變更,以解決客戶的意見反應。
使用 -IncludeTypeInformation
來保留先前的行為。
先前,-LiteralPath
會將通配符視為和 -Path
相同,且如果通配符未找到任何檔案,則會靜默結束。 正確的行為應該是 -LiteralPath
是字面上的值,所以如果檔案不存在,應該會報錯。 將變更為把與 -Literal
搭配使用的通配符視為常值。
作為效能改善的一部分, Group-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
參數,並接受 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
過去,PowerShell 在 Windows 上提供一個函式,稱為 more
,該函式包裝了 more.com
。 該函式現已移除。
此外,函式 help
已變更為在 Windows 上使用 more.com
,或在非 Windows 平台上使用 $Env:PAGER
指定的系統預設分頁器。
先前,使用 Set-Location
或 cd
返回 PSDrive,將用戶傳送至該磁碟驅動器的預設位置。 用戶現在會被導引至該會話中最後一個已知的當前工作目錄。
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
現在預設會儲存使用者範圍資料夾的說明。
在將-Not
參數新增至Where-Object
後,可以在管線中篩選物件,以篩出屬性不存在或屬性值為Null/空白的物件。
例如,此命令會傳回未定義任何相依服務的所有服務:
Get-Service | Where-Object -Not DependentServices
Web Cmdlet 的基礎 .NET API 已變更為 System.Net.Http.HttpClient
。 這項變更提供許多優點。 不過,這項變更以及與 Internet Explorer 相容性不足,導致在Invoke-WebRequest
和Invoke-RestMethod
內的數個中斷性變更。
-
Invoke-WebRequest
現在僅支援基本 HTML 剖析。Invoke-WebRequest
一律會傳BasicHtmlWebResponseObject
回物件。ParsedHtml
和Forms
屬性已移除。 -
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 的參數
當 API 只 null
傳回 時, Invoke-RestMethod
會將這個 串行化為字串 "null"
,而不是 $null
。 這項變更會修正 Invoke-RestMethod
中的邏輯,將有效的單一值 JSON null
文字正確序列化為 $null
。
使用 HTTP 時,包含密碼的內容會以純文字傳送。 這項變更預設不允許此變更,如果認證傳遞不安全,則傳回錯誤。 用戶可以使用 -AllowUnencryptedAuthentication
開關略過此切換。
從 PowerShell 7.1 開始,Web Cmdlet 的 OutFile 參數會像 LiteralPath 一樣運作,而且不會處理通配符。
類別 AddTypeCommandBase
已從 Add-Type
中移除,以改善效能。 此類別僅供 Add-Type
Cmdlet 使用,且不應影響使用者。
在過去,您可以使用 Cmdlet 編譯 Visual Basic 程式代碼 Add-Type
。 Visual Basic 很少用於 Add-Type
。 我們已移除這項功能,以減少PowerShell的大小。
先前,使用 API 以程式設計方式建立 PowerShell Runspace 時,您可以使用舊版 RunspaceConfiguration
或較 InitialSessionState
新的類別。 這項變更已移除 對 RunspaceConfiguration
的支援,且僅支援 InitialSessionState
。
參數的位置不正確,導致args傳遞為輸入,而不是做為自變數。
的 ClrVersion
$PSVersionTable
屬性不適用於 CoreCLR。 終端使用者不應該使用該值來判斷相容性。
屬性 BuildVersion
已系結至非 Windows 平台上無法使用的 Windows 組建版本。
GitCommitId
使用 屬性來擷取 PowerShell 的確切組建版本。
`u####
或 `u{####}
會轉換成對應的 Unicode 字元。 若要輸出常值 `u
,請跳脫反引號: ``u
。
ValueFromRemainingArguments
現在會將值當做陣列傳回,而不是本身為陣列的單一值。
清除與 System.Management.Automation 中使用 CommandTypes.Workflow
和 WorkflowInfo
相關的程式代碼。
這些輕微的破壞性變更主要會影響協助提供者程式碼。
- 將
WorkflowInfo
的公用建構函式變更為內部的。 我們不再支援工作流程,因此不允許人員建立Workflow
實例是合理的。 - 拿掉 System.Management.Automation.DebugSource 類型,因為它僅用於工作流程偵錯。
- 從僅用於工作流程偵錯的抽象類別 Debugger 中移除多載
SetParent
。 - 從衍生類別 RemotingJobDebugger 中移除 相同的 多載
SetParent
。
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 是 PowerShell 和 Hyper-V 的功能,可讓您連線到 Hyper-V VM 或容器,而不需要網路連線或其他遠端管理服務。
在過去,PowerShell Direct 會使用容器上的內建 Windows PowerShell 實例進行連線。 現在,PowerShell Direct 會先嘗試使用任何可用的 pwsh.exe
在 PATH
環境變數中進行連線。 如果 pwsh.exe
無法使用,PowerShell Direct 會回復為使用 powershell.exe
。
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
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
以停用遙測。
其他資源
文件
-
PowerShell 7.5 的新功能 - PowerShell
PowerShell 7.5 中發行的新功能和變更
-
PowerShell 7.4 的新功能 - PowerShell
PowerShell 7.4 中發行的新功能和變更
-
非 Windows 平臺上的 PowerShell 差異 - PowerShell
本文摘要說明 Windows 上的 PowerShell 與非 Windows 平臺上的 PowerShell 之間的差異。
-
在 Windows 上安裝 PowerShell - PowerShell
在 Windows 上安裝 PowerShell 的相關信息