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

Windows PowerShell 5.1 是以 .NET Framework 4.5 為基礎。 隨著 PowerShell 6.0 的發行,PowerShell 成為以 .NET Core 2.0 為基礎的開放原始碼專案。 PowerShell 7.0 是以 .NET Core 3.1 為基礎。 而且,隨著 PowerShell 7.2 的發行,PowerShell 將會建置於 .NET 6.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 vs .net Core

Linux 和 macOS 上的 PowerShell 使用 .net Core,這是 Microsoft Windows 完整 .NET Framework 的子集。 這很重要,因為 PowerShell 可直接存取基礎架構類型和方法。 因此,在 Windows 上執行的指令碼可能無法在非 Windows 平台上執行,因為架構差異的緣故。 如需 .net core 變更的詳細資訊,請參閱從 .NET Framework 遷移至 .net core 的重大變更

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

如需詳細資訊,請參閱:

檔中使用的產品術語

PowerShell 的檔包含兩種類型的內容: Cmdlet 參考和概念內容。 Cmdlet 參考是版本特定的。 您可以從頁面左上角的下拉式功能表切換版本。 當您變更版本時,概念內容不會變更。 一般而言,這些概念適用于所有版本的 PowerShell,除非發行項呼叫特定版本。

  • PowerShell -這是我們用於產品的預設名稱。 當我們在檔中使用此名稱時,我們會討論目前的 PowerShell 版本。 PowerShell 和 Windows PowerShell 之間的差異,請注意特定版本。
  • Windows PowerShell -建置於 .NET Framework 上的 PowerShell。 Windows PowerShell 僅隨附于 Windows,而且需要完整的架構。 您可以在相同的 Windows 電腦上同時執行 PowerShell 與 Windows PowerShell。

模組不再隨附于 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 所包含的模組,下列 Cmdlet 已從 PowerShell 移除,以因應各種相容性的原因或使用不支援的 Api。

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

CimCmdlets 模組 (也稱為 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,因此已 *-EventLog 從 PowerShell 移除 Cmdlet。 Get-WinEventNew-WinEvent 可在 Windows 上取得並建立事件。

使用 Windows Presentation Framework (WPF) 的 Cmdlet

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

  • Show-CommandCmdlet
  • Out-GridViewCmdlet
  • ShowWindow 參數 Get-Help

PowerShell Desired State Configuration (DSC) 變更

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

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

引擎/語言變更

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

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

其他從 powershell.exepwsh(.exe) 的變更:

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

該簡短名稱也與非 Windows 平台上殼層的命名一致。

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

先前,使用 pwsh.exe 來執行 PowerShell 腳本時, -File 無法以 $true / $false 參數值的方式傳遞。 已新增將 $true/$false 作為參數剖析值的支援。 也支援參數值。

支援 PowerShell 作為預設的 Unix shell

在 Unix 上,殼層接受互動式殼層的 -i 是一項慣例,許多工具都預期此行為 (例如 script,以及將 PowerShell 設定為預設殼層時) 而會使用 -i 參數來呼叫殼層。 這項變更之所以為中斷性變更,在於 -i 先前可用來作為用以比對 -inputformat 的簡寫,但現在則必須使用 -in

自訂嵌入式管理單元

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

由於支援的嵌入式管理單元和其在社區中缺乏使用的複雜度,我們不再于 PowerShell 中支援自訂嵌入式管理單元。

實驗性功能旗標

我們已啟用對實驗性功能的支援。 這可讓 PowerShell 開發人員在設計完成之前,先提供新功能並取得意見反應。 我們也能藉此避免在設計演變的過程中進行重大變更。

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

從模組基底路徑載入元件,然後嘗試從 GAC 載入

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

針對具有實數值型別元素類型的集合,略過 null 元素檢查

如果集合的元素類型是值類型,便針對 Mandatory 參數及 ValidateNotNullValidateNotNullOrEmpty 屬性,略過 Null 元素檢查。

保留 $? ParenExpression子運算式產生

此 PR 改變了編譯 subpipelines、子 (...) 運算式 $(...) 和陣列運算式的方式, @() 因此 $? 不會自動成為 true。 相反地,的值 $? 取決於所執行之管線或語句的結果。

修正 $? $false 原生命令寫入至 stderr

$?``$false當原生命令寫入時,不會設定為 stderr 。 原生命令通常會寫入, stderr 而不想要指出失敗。 $?``$false只有當原生命令具有非零的結束代碼時,才會設定為。

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

原生命令通常會寫入, stderr 而不想要指出失敗。 透過這項變更, stderr 仍會在 ErrorRecord 物件中捕捉輸出,但 $ErrorActionPreference 如果 ErrorRecord 來自原生命令,則執行時間不再適用。

變更 $OutputEncoding 為使用 UTF-8 NoBOM 編碼而非 ASCII

先前的編碼 ASCII (7 位元) 在某些情況下會造成不正確的輸出變更。 UTF-8 NoBOM將預設值保留為具有大部分工具和作業系統所支援之編碼的 Unicode 輸出。

將 Cmdlet 與參數整合 -Encoding 為類型 System.Text.Encoding

已從檔案系統提供者 Cmdlet 中移除 -EncodingByte。 現在是使用新參數 -AsByteStream 來指定必須使用位元組資料流作為輸入,或是指定輸出為位元組資料流。

New-ModuleManifest UTF8NoBOM 在非 Windows 平臺上將編碼變更為

先前會 New-ModuleManifest psd1 在具有 BOM 的 utf-16 中建立資訊清單,並為 Linux 工具建立問題。 這項中斷性變更會在非 Windows 平台中,將 New-ModuleManifest 的編碼變更為 UTF (無 BOM)。

AllScope從大多數預設別名中移除

為了加快建立範圍的速度,已從大多數預設別名中移除 AllScope。 針對一些經常使用且查閱速度較快的別名則保留了 AllScope

-Verbose 而且 -Debug 不再覆寫 $ErrorActionPreference

先前,如果指定了 -Verbose-Debug,就會覆寫 $ErrorActionPreference 的行為。 藉由這項變更,-Verbose-Debug 便不再影響 $ErrorActionPreference 的行為。

此外, -Debug 參數會設定 $DebugPreferenceContinue 而非 Inquire

$PSCulture一致地反映會話內文化特性變更

在 Windows PowerShell 中,會快取目前的文化特性值,這可讓值與文化特性的同步處理在會話啟動之後就會變更。 此快取行為是在 PowerShell core 中修正。

允許明確指定的具名引數取代同一個雜湊表中的相同參數展開

透過這項變更,展開中的具名引數會移至參數清單的結尾,使其在所有明確指定的具名引數都系結之後系結。 找不到指定的具名引數時,簡單函式的參數系結不會擲回錯誤。 未知的具名引數會系結至 $args 簡單函數的參數。 將展開移至引數清單的結尾,會變更參數出現的順序 $args

例如︰

function SimpleTest {
    param(
        $Name,
        $Path
    )
    "Name: $Name; Path: $Path; Args: $args"
}

在先前的行為中 , -Path 因為在引數清單中是第三個引數,所以不會系結 MyPath。 # # 因此它最後會芝至 ' $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

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

& 置於管線結尾,會將管線執行為 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)

Cmdlet 變更

查看 system32 中是否有符合 Windows 規範的內建模組

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

當 PowerShell 啟動時,會自動將它包含 $windir\System32PSModulePath 環境變數中。 不過,如果其 CompatiblePSEdition 標示為與 Core 相容,則只會對 Get-ModuleImport-Module 公開模組。

您可以使用 -SkipEditionCheck 切換參數來覆寫此行為以顯示所有模組。 我們也將 PSEdition 屬性新增至資料表輸出。

用於所有 -LiteralPath 參數的 -lp 別名

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

修正 Get-Item -LiteralPath a*b 是否 a*b 真的沒有傳回錯誤

先前,將萬用字元指定給 -LiteralPath 時,它會將其視為與 -Path 相同,而如果該萬用字元找不到任何檔案,它就會以無訊息模式結束。 正確的行為應該是 -LiteralPath 為常值,因此如果檔案不存在,它應該發生錯誤。 這項變更是要將與 -Literal 搭配使用的萬用字元視為常值。

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

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

-Protocol*-Computer Cmdlet 移除

由於 CoreFX 中的 RPC 遠端處理問題 (特別是在非 Windows 平台上),以及確保 PowerShell 中有一致的遠端處理體驗,因此已從 \*-Computer Cmdlet 中移除 -Protocol 參數。 DCOM 不再支援遠端。 下列 Cmdlet 僅支援 WSMAN 遠端:

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

-ComputerName*-Service Cmdlet 移除

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

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

先前,使用 Get-Content -Delimiter 時的輸出既不一致也不便利,因為需要進行進一步的資料處理,才能移除分隔符號。 這項變更會將所傳回行中的分隔符號移除。

變更為 Format-Hex

-Raw 參數現在是一個「無作業」(亦即不執行任何操作)。 向前復原所有輸出時,會顯示包含其類型所有位元組的真正數位標記法。 這是參數在 -Raw 這項變更之前所執行的作業。

修正 Get-ComputerInfo 屬性名稱中的打字問題

BiosSerialNumber 先前拼字錯誤導致變成 BiosSeralNumber,現已變更為正確的拼字。

Add Get-StringHashGet-FileHash Cmdlet

這項變更是因為 CoreFX 不支援某些雜湊演算法,所以已不再提供這些演算法:

  • MACTripleDES
  • RIPEMD160

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

$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.com 的函式,稱為 more。 該函式現在已移除。

此外,help 函式已變更為使用 more.com (在 Windows 上) 或 $env:PAGER 所指定系統的預設頁面巡覽區 (非 Windows 平台上)。

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 上目前未提供任何憑證型驗證。
  • 透過 http:// URI 使用 -Credential 將會造成錯誤。 請使用 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 傳回,就 nullInvoke-RestMethod 將它序列化為字串, "null" 而不是 $null 。 這項變更會修正 Invoke-RestMethod 中的邏輯,將有效的單一值 JSON null 常值序列化為 $null

Web Cmdlet 會在透過 -Credential 未加密的連接傳送時發出警告

使用 HTTP 時,內容 (包括密碼) 會以純文字方式傳送。 這項變更是要預設禁止此行為,並在以不安全方式傳遞認證時傳回錯誤。 使用者可以使用 -AllowUnencryptedAuthentication 參數來略過此作業。

API 變更

移除 AddTypeCommandBase 類別

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

已將 VisualBasic 從 Add-Type 支援的語言中移除

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

已移除 RunspaceConfiguration 支援

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

CommandInvocationIntrinsics.InvokeScript 將引數系結至, $input 而不是 $args

不正確的參數位置導致引數被當作輸入來傳遞,而不是當成引數。

移除 ClrVersionBuildVersion 屬性來源 $PSVersionTable

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

BuildVersion屬性已系結至 Windows 組建版本,在非 Windows 平臺上無法使用。 您 GitCommitId 可以使用屬性來取出 PowerShell 的確切組建版本。

執行 Unicode escape 剖析

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

PS 函數中的參數系結問題 ValueFromRemainingArguments

ValueFromRemainingArguments 現在會以陣列的形式傳回值,而不是傳回本身為陣列的單一值。

已清除 CommandTypes.WorkflowWorkflowInfoCleaned 的使用

清除與使用 CommandTypes.WorkflowWorkflowInfoManagement. Automation 中相關的程式碼。

這些微小的重大變更主要會影響 help provider 程式碼。

  • 將公用的函式變更 WorkflowInfo 為 internal。 我們不再支援工作流程,因此不允許使用者建立實例是合理的 Workflow
  • 請移除 DebugSource ,因為它只用于工作流程的偵錯工具。
  • SetParent從僅用於工作流程偵錯工具的抽象類別 偵錯工具 中移除的多載。
  • SetParent從衍生類別 RemotingJobDebugger 中移除相同的多載。

PSObject 轉換成委派時,請勿將傳回結果換行 ScriptBlock

ScriptBlock 轉換成要在 c # 內容中使用的委派型別時,將結果包裝在中會 PSObject 帶來不必要的麻煩很快找上門:

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

在這項變更之後,傳回的物件會是基礎物件。

遠端處理支援

在 Unix 平臺上使用 WinRM 的 PowerShell 遠端 (PSRP) 需要透過 HTTPS 進行 NTLM/Negotiate 或基本驗證。 MacOS 上的 PSRP 只支援透過 HTTPS 進行基本驗證。 非 Windows 的平臺不支援以 Kerberos 為基礎的驗證。

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

適用于容器的 PowerShell Direct 會 pwsh 先嘗試使用

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

過去,PowerShell Direct 使用容器上的內建 Windows PowerShell 執行個體進行連線。 現在,PowerShell 會先嘗試使用 PATH 環境變數上的任何可用 pwsh.exe 進行連線。 如果沒有 pwsh.exe,PowerShell Direct 會改為使用 powershell.exe

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

Enable-PSRemoting 現在會建立兩個遠端工作階段設定:

  • 一個用於 PowerShell 的主要版本。 例如: PowerShell.6 。 在次要版本更新之間,可依賴此端點作為「全系統」的 PowerShell 6 工作階段設定
  • 一個版本特定的工作階段設定,例如:PowerShell.6.1.0

如果您想要在相同電腦上安裝多個 PowerShell 6 版本以供存取,此行為會很有用。

此外,PowerShell 的預覽版本現在可在執行 Enable-PSRemoting Cmdlet 之後,取得自己的遠端工作階段設定:

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

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

遙測只能透過環境變數停用

PowerShell 會在啟動時將基本遙測資料傳送給 Microsoft。 該資料包括作業系統名稱、作業系統版本和 PowerShell 版本。 這項資料可讓我們更加了解使用 PowerShell 的環境,並讓我們排列新功能和修正的優先順序。

若要退出此遙測,請將環境變數 POWERSHELL_TELEMETRY_OPTOUT 設定為 trueyes1。 我們不再支援透過刪除 DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY 檔案來停用遙測。