PowerShell Core 6.0 是開源的,支持跨平臺(Windows / macOS 和 Linux)的新版本,其構建目標即爲支持異構環境及混合雲。git
譯者注:異構環境 - 因爲 PowerShell 最先被設計爲運行在 Windows NT / .Net 平臺,這裏的異構指 *NIX 平臺github
PowerShell Core 使用 .Net Core 2.0 做爲其運行時平臺,.Net Core 2.0 使 PowerShell 能夠被運行於多個平臺(Windows / macOS 和 Linux)之上。PowerShell Core 同時向外暴露由 .Net Core 2.0 提供的 API 集合,用於 cmdlet 及腳本中。web
Windows PowerShell 使用 .Net Framework 託管 PowerShell 引擎,所以其向外暴露由 .Net Framework 提供的 API 集合。docker
.NET Core 與 .NET Framework 間 API 的區別被定義爲 .Net 標準 中的一部分shell
For more information on how this affects module/script compatibility between PowerShell Core and Windows PowerShell, see Backwards compatibility with Windows PowerShell.json
更多關於此對 PowerShell Core / Windows PowerShell 模塊或腳本的兼容性影響可參考 Windows PowerShell 向前兼容性。windows
PowerShell 現提供對以下 Linux / macOS 發行版的官方支持,支持範圍包含:數組
咱們的社區同時也提供對以下平臺的 PowerShell 發行包,但它們並不是被官方支持:緩存
同時咱們提供一些實驗性的(非正式支持的)發行版用於下列平臺:
A number of changes were made to in PowerShell Core 6.0 to make it work better on non-Windows systems. Some of these are breaking changes, which also affect Windows. Others are only present or applicable in non-Windows installations of PowerShell Core.
PowerShell Core 6.0 包含了大量針對非 Windows 平臺的修正,其中的部分是斷裂性影響,甚至將同時影響 Windows 平臺,其他的只出現或被啓用在非 Windows 平臺的 PowerShell Core 上。
more
功能採用 Linux 的默認分頁器策略,即 less
。這表明用戶能夠在原生二進制/命令間使用通配符(例如,ls *.txt
)。-ExecutionPolicy
開關被默認忽略。NoEcho
功能。Get-help
以支持 UNIX 平臺上非大小寫敏感的模式匹配。powershell
於安裝包中添加幫助頁(man-page)。於 macOS 中,PowerShell 使用原生的 os_log
API 以記錄日誌於 Apple 統一日誌系統中。於 Linux 中,PowerShell 使用 Syslog
這個通用的日誌解決方案。
一系列更新已被運用於 macOS 與 Linux 平臺以支持傳統意義上於 Windows 平臺上不支持的文件名內字符:
對 cmdlet 輸入的路徑現已斜槓無感化(slash-agnostic)。即 /
與 \
都可被用作路徑分割符
XDG 基本路徑規範現已被採納並被默認開啓
譯者注:XDG 基本路徑規範 - 即 XDG Base Directory Specification,用於規範操做系統與上層應用對路徑名的處理規範
~/.config/powershell/profile.ps1
~/.local/share/powershell/PSReadline/ConsoleHost_history.txt
~/.local/share/powershell/Modules
於 UNIX 平臺支持包含冒號的文件 / 文件夾名
支持包含逗號的腳本名或路徑(感謝 @TimCurwick!)
路徑跳轉相關的 cmdlet 中支持 -LiteralPath
參數,該參數被聲明時,通配擴展將被禁用
升級 Get-ChildItem
使得其工做模式更相似於 UNIX 平臺的 ls -R
及 Windows 平臺的 DIR /S
命令。Get-ChildItem
現返回遞歸搜索中遇到的符號連接且不搜索該符號連接對應的路徑。
Linux 及 macOS 傾向於大小寫敏感而 Windows 平臺傾向於大小寫不敏感,總的來講,PowerShell 使大小寫不敏感的。
舉例來講,macOS 與 Linux 平臺上的環境變量是大小寫敏感的,所以 PSModulePath
這樣的環境變量已經被預先置爲了固定的大小寫組合形式。Import-Module
在經過文件路徑決定模塊名稱時,是大小寫不敏感的
PowerShell Core 的安裝 / 配置及執行都與 Windows PowerShell 相隔離。PowerShell Core 存在便攜式 ZIP 包,經過該包,用戶能夠於磁盤上部署任意套 PowerShell Core 並將他們做爲其餘應用的依賴。共存(side-by-side)安裝方案使得對新 PowerShell 版本的測試及存量腳本的遷移更加容易。同時,該方案也可用於對運行於某特定版本的腳本作兼容性配置。
注:默認的,Windows 平臺基於 MSI 的安裝包將對系統現註冊 PowerShell 實例進行替換升級。
powershell(.exe)
重命名爲 pwsh(.exe)
PowerShell Core 的執行二進制文件由 powershell(.exe)
改名爲 pwsh(.exe)
。這一改變使用戶能夠肯定性的運行共存(side-by-side)安裝模式下的 PowerShell Core。並且 pwsh
更短也更好記。
其餘從 powershell(.exe)
重命名爲 pwsh(.exe)
後的改變:
-Command
至 -File
。這一改變修復了 PowerShell 腳本中的 #!
的使用於非 Windows 平臺定向至非 PowerShell shell 的可能性。這也意味着用戶能夠直接運行腳本,而不用指明 -File
參數,如 pwsh foo.ps1
/ pwsh fooScript
。同時這也意味着,用戶但願運行某命令時必須聲明 -Command
/ -c
入口,如 pwsh.exe -Command Get-Command
。-i
/ -Interactive
爲開關標識的交互式 shell 模式。這使得 PowerShell 能夠在 Unix 平臺上被做爲默認 shell。pwsh.exe
中移除了 -importsystemmodules
/ -psconsoleFile
參數pwsh -version
以及 pwsh.exe
的內置幫助,以與其餘原生工具保持一致。(感謝 @iSazonov!)-File
/ -Command
錯誤參數報錯信息及退出碼與 Unix 標準保持一致-WindowStyle
參數。類似的,非 Windows 平臺基於包的 PowerShell 安裝將升級已經安裝的實例。PowerShell 的設計目標之一即爲儘可能保持與 Windows PowerShell 的向前兼容性。PowerShell Core 使用 .Net Standard 2.0 版本與其餘現存 .Net 版本保持彙編兼容性。許多 PowerShell 模塊依賴這些 .Net 彙編(有時是 DLL),所以 .Net 標準使得這些模塊也能夠在 PowerShell Core 上工做。PowerShell Core 也包含自發現功能用以探測知名路徑,好比全局彙編緩存(Global Assembly Cache)路徑等,以尋找 .NET Framework DLL 依賴。
更多 .NET Standard 相關內容能夠經過 .NET Blog 或此 YouTube 視頻,或經過該託管於 GitHub 上的 FAQ 瞭解。
PowerShell Core 爲確保其內置模塊(如 Microsoft.PowerShell.Management
或 Microsoft.PowerShell.Utility
等)與 Windows PowerShell 保持一致已付出巨大努力。在不少狀況下,在社區的協助下,咱們已經爲這些 cmdlet 添加了新能力以及 Bug 修復。在某些狀況下,因爲部分 .Net 層次上的依賴缺失,受影響的功能是不可用的或已經被移除。
大部分做爲 Windows 組件分發的模塊(例如 DnsClient
/ Hyper-V
/ NetTCPIP
/ Storage
等)及其餘微軟產品,例如 Azure 與 Office 等還沒有明確的被移植到 .Net Core 中。PowerShell 團隊正在與這些產品的相關團隊一同驗證並移植這些現存模塊至 PowerShell Core With .NET Standard and CDXML,大部分現存的 Windows PowerShell 模塊看上去確實能夠在 PowerShell Core 中正確使用,但這仍然須要官方驗證,所以他們現今也未被徹底支持。
經過安裝 WindowsPSModulePath 模塊,用戶也能夠經過將 Windows PowerShell PSModulePath
填充至 PowerShell Core PSModulePath
的方式,使用這些模塊。
首先,從 PowerShell Gallery 安裝 WindowsPSModulePath
模塊:
# Add `-Scope CurrentUser` if you're installing as non-admin
Install-Module WindowsPSModulePath -Force
複製代碼
其後,運行 Add-WindowsPSModulePath
cmdlet 將 Windows PowerShell 的 PSModulePath
加入到 PowerShell Core 中:
# Add this line to your profile if you always want Windows PowerShell PSModulePath
Add-WindowsPSModulePath
複製代碼
PowerShell Core 爲全部其支持的主流平臺(包含多個 Linux 發行版,Windows Server Core 與 Nano Server 等)添加了 Docker 容器鏡像。
獲取完整列表,請嘗試訪問 microsoft/powershell on Docker Hub,更詳細信息,請查看 GitHub 上的 Docker 相關信息。
PowerShell Remoting Protocol(PSRP)除運行於傳統的 WinRM 外,現能夠工做於 Secure Shell Protocol(SSH)之上。
這表明用戶能夠經過 Enter-PSSession
/ New-PSSession
創建基於 SSH 的會話。全部用戶須要作的,僅僅是將 PowerShell 註冊爲基於 OpenSSH 的 SSH Server 的一個子系統,以後即可經過 PSSession
語義層使用傳統的 SSH 認證(如密碼或私鑰等)。
更多關於配置並使用 SSH 基礎的遠程鏈接的信息,請參考 PowerShell Remoting over SSH。
New-ModuleManifest
外設置爲沒有字節序標識的 UTF-8 編碼在過往版本中,Windows PowerShell cmdlet 例如 Get-Content
/ Set-Content
使用不一樣的編碼規範,好比 ASCII 及 UTF-16。默認編碼上的不一樣將在混合使用未統一編碼格式的 cmdlet 時產生問題。
非 Windows 平臺傳統上使用沒有字節序標識(BOM)的 UTF-8 編碼格式做爲文本的默認編碼格式。更多的 Windows 程序和工具正在從 UTF-16 向沒有字節序標識的 UTF-8 編碼格式遷移。PowerShell Core 改變了默認的編碼格式以適應更普遍的平臺。
這表明全部可以使用 -Encoding
參數的內置 cmdlet 將默認取值爲 UTF8NoBOM
。如下的 cmdlet 將被該改動所影響:
這些 cmdlet 也同時得到了升級,所以 -Encoding
參數全局上將採納 System.Text.Encoding
。
$OutputEncoding
的默認值也被轉變爲 UTF-8。
最爲最佳實踐,用戶應當於腳本中明確的經過 -Encoding
參數設置編碼類型,以在各個平臺上取得可預期的肯定性結果。
New-ModuleManifest
cmdlet 不具有 -Encoding
參數。經過 New-ModuleManifest
建立的模塊配置文件(.psd1)的編碼類型由環境決定:若是 PowerShell Core 運行於 Linux 環境中時,那麼採用沒有字節序標識(BOM)的 UTF-8 編碼;不然採用有字節序標識(BOM)的 UTF-16 編碼。
&
符號放置於後臺放置 &
符號於一條流水線的尾部將使得該流水線被做爲一個 PowerShell Job 運行。當一個流水線被放置於後臺時,將返回一個 Job 對象。當一條流水線做爲 Job 運行時,全部的標準 *-Job
cmdlet 能夠被用於管理 Job。變量(忽略進程相關變量)將自動被拷貝到 Job 中,所以 Copy-Item $foo $bar &
能夠工做。同時,Job 被運行於當前目錄而不是用戶的家目錄。更多關於 PowerShell Job 的信息請參考 about jobs。
SemanticVersion
兼容 SemVer 2.0
。(感謝 @iSazonov!)New-ModuleManifest
默認的 ModuleVersion
至 0.0.1
以對齊 SemVer 版本。(感謝 @LDSpits!)System.Management.Automation.SemanticVersion
增長 semver
類型加速器SemanticVersion
實例與 Version
實例,當後者僅包含 Major
/ Minor
兩個值時..
運算符增長字符範圍重載,所以 'a'..'z'
返回從 a
到 z
的字符。(感謝 @IISResetMe!)$PSVersionTable
加入四個新屬性:
PSEdition
:於 PowerShell 平臺返回 Core
,Windows PowerShell 平臺返回 Desktop
[System.Runtime.InteropServices.RuntimeInformation]::OSDescription
的字符串值[System.Environment]::OSVersion.Platform
的字符串值,於 Windows 平臺爲 Win32NT
,於 macOS / Linux 爲 Unix
$PSVersionTable
中移除 BuildVersion
屬性,該屬性強依賴於 Windows 版本,如今可使用 GitCommitId
以得到精確的 PowerShell Core 構建版本。(感謝 @iSazonov!)$PSVersionTable
中移除 ClrVersion
屬性,該屬性與 .Net Core 無關,且其保留於 .Net Core 中僅僅做爲歷史遺留緣由且在 PowerShell Core 中不可用$IsWindows
/ $IsMacOs
/ $IsLinux
GitCommitId
至 PowerShell Core 提示條。如今再也不須要經過 $PSVersionTable
獲取,而在啓動時能夠直接獲得版本信息。(感謝 @iSazonov!)$PSHome
路徑下新增名爲 powershell.config.json
的 JSON 格式的配置文件以存儲首次運行時的某些配置,如 ExecutionPolicy
Microsoft.PowerShell.Utility
增長 Get-Uptime
Remove-Alias
命令。(感謝 @PowershellNinja!)Remove-Service
命令用於管理模塊。(感謝 @joandrsn!)Invoke-WebRequest
,當網絡迴應包含連接頭部,其將創建一個基於字典的 RelationLink 屬性以表示 URL 以及 rel
字段間的關係,並確保各個連接均爲絕對地址以簡化開發。Invoke-RestMethod
,當網絡迴應包含連接頭部,其將暴露一個 -FollowRelLink
開關去自動跟蹤下一個 rel
連接直至達到最終的地址或跳次數達到可預設的 ·-MaximumFollowRelLink
值-CustomMethod
參數支持,以支持包含非標準動詞的 cmdlet。(感謝 @Lee303!)SslProtocol
支持。(感謝 @markekraus!)-NoProxy
參數支持以使得他們能夠忽略系統代理。(感謝 @TheFlyingCorpse!)-SkipHeaderValidation
開關,以支持不驗證頭部值下添加自定義頭部-Authentication
參數,提供三種選項:Basic
/ OAuth
/ Bearer
。-Token
參數,用於獲取 OAuth
/ Bearer
模式下的令牌。-AllowUnencryptedAuthentication
參數,用於短路任何非 HTTPS 協議下傳輸模式的驗證功能Invoke-RestMethod
增長 -ResponseHeadersVariable
參數以使能頭部數據捕獲。(感謝 @markekraus!)UserAgent
從 WindowsPowerShell
移動至 PowerShell
。(感謝 @markekraus!)Invoke-RestMethod
增長明確的 ContentType
檢測功能。-SkipHeaderValidation
參數使其能夠兼容含非標準 UA 的 HTTP 包頭。(感謝 @markekraus!)ConvertFrom-Json
增長 -AsHashtable
參數,使其返回值爲一個 Hashtable
而不是默認類型。(感謝 @bergmeister!)ConvertTo-Json
輸出。(感謝 @kittholland!)ConvertTo-Json
添加 Jobject
序列化支持。ConvertFrom-Json
以使其能夠反序列化字符串數組造成 JSON 格式的字符串。本項更新修復某些狀況下新行符可能意外終止 JSON 解釋的問題。System.Array
中的 AliasProperty "Count"
聲明,以去除某些 ConvertFrom-Json
結果中額外產生的 Count
屬性。(感謝 @PetSerAl!)Import-Csv
及 ConvertFrom-Csv
增長 PSTypeName
支持。(感謝 @markekraus!)Import-Csv
可支持 CR / LF / CRLF
做爲行分隔符。(感謝 @iSazonov!)Export-Csv
及 ConvertTo-Csv
增長默認值 -NoTypeInformation
。(感謝 @markekraus!)Get-Service
cmdlet 返回的 ServiceController
對象添加屬性:UserName
/ Description
/ DelayedAutoStart
/ BinaryPathName
/ StartupType
。(感謝 @joandrsn!)Set-Service
增長證書設置功能。(感謝 @joandrsn!)Get-ChildItem
增長參數 -FollowSymlink
使其能夠提供支持循環引用檢測的按需連接遍歷功能。Add-Type
以支持 CSharpVersion7
。(感謝 @iSazonov!)Microsoft.PowerShell.LocalAccounts
模塊,因爲其使用了已經不支持了的 API,當找到更好的解決方案時會被恢復。Microsoft.PowerShell.Diagnostics
中的 *-Counter
cmdlet,因爲其使用了已經不支持了的 API,當找到更好的解決方案時會被恢復。Invoke-Item -Path <folder>
。Split-Path
cmdlet 提供 -Extension
及 -LeafBase
開關,使用戶能夠切分路徑中的文件擴展名和剩餘部分。(感謝 @powercode!)Sort-Object
增長 -Top
及 -Bottom
參數,使其支持對首尾的 N 個項目進行排序System.Diagnostics.Process
中增長 CodeProperty "Parent"
以暴露進程的父進程。(感謝 @powercode!)Get-Process
中的內存列使用 MB 爲單位,替換原來的 KBOut-String
增長 -NoNewLine
開關。(感謝 @raghav710!)Move-Item
添加 -Include
/ -Exclude
/ -Filter
參數。*
用做 Remove-Item
的註冊路徑。Get-Credential
增長 -Title
選項,並統一跨平臺體驗。Test-Connection
增長 -TimeOut
選項Get-AuthenticodeSignature
cmdlet 現能夠獲取文件簽名時間戳Get-Help
cmdlet 不主持的 -ShowWindow
開關Get-Content -Delimiter
使其在返回的數組元素中不包含分界符。(感謝 @mklement0!)ConvertTo-HTML
增長 Meta
/ Charset
/ Transitional
選項。(感謝 @ergo3114!)Get-ComputerInfo
返回值添加 WindowsUBR
及 WindowsVersion
屬性。Get-Verb
增長 -Group
參數。New-FileCatalog
及 Test-FileCatalog
增長 ShouldProcess
支持(修復 -WhatIf
/ -Confirm
)。(感謝 @iSazonov!)Start-Process
cmdlet 增長 -WhatIf
開關。(感謝 @sarithsutha!)ValidateNotNullOrEmpty
至現存參數基於運行時變量值加強 Tab 補全中的類型推斷功能。(感謝 @powercode!)這使得以下狀況下的 Tab 補全可用:
$p = Get-Process
$p | Foreach-Object Prio<tab>
複製代碼
爲 Select-Object
的 -Property
選項添加哈希表 Tab 補全。(感謝 @powercode!)
爲 Select-Object
的 -ExcludeProperty
和 -ExpandProperty
選項參數添加自動補全。(感謝 @iSazonov!)
修復一個 Tab 補全中的 Bug:native.exe --<tab>
調起原生程序自帶補全功能。(感謝 @powercode!)
PowerShell Core 引入了大量斷裂性改變,詳細內容請參考 PowerShell Core 6.0 中的斷裂性改變。
Invoke-Command -ComputerName
提供遠程步進調試(remote step-in debugging)支持Split-Path
如今可用於 UNC 根下cd
不帶參時,默認行爲爲 cd ~
咱們已經爲 PowerShell 平臺配置了大量性能提高,包含對啓動時間 / 多種內置 cmdlet 及與原生二進制交互性的優化。
同時,咱們也修理了大量的 PowerShell Core 中發現的 Bug,完整列表與更改描述,請參考咱們放置於 GitHub 上的 CHANGELOG
$PSVersionTable.OSDescription
)$PSVersionTable.GitCommitId
)若是用戶但願自願退出該項感知功能(即:信息收集)只需聲明環境變量 POWERSHELL_TELEMETRY_OPTOUT
爲以下的一個值:true / 1 /yes
。聲明該環境變量將忽略全部感知功能,即便於 PowerShell 首次啓動時。咱們已經計劃公開從該項遙感計劃中獲得的數據和提煉的感知於社區中。你能夠從該博客中得到更多詳細信息。