網頁

加入 PowerShell Core(pwsh.exe) 的行列吧!

加入 PowerShell Core(pwsh.exe) 的行列吧!

目前 PowerShell 有二個主要分支,一個 Windows 內建的 PowerShell,一個是開源的 PowerShell Core 版本。PowerShell 提供全面的系統與應用支援。PowerShell Core 提供重要的跨平台支援。PowerShell (Core) 兩者各有優缺點,PowerShell 由 Windows 10 預設內建與僅支援 Windows,為求系統最大相容與穩定,更新速度不快,而且某些 .NET Framework 的特色也被繼承下來!PowerShell Core 採用 .NET Core 重新開發的開源版本,更新速度快,而且會盡量採用優秀的開源套件來整合與開發。

Windows PowerShell 在早期的 Windows 7, 8 / Windows Server 2008, 2012, 2012 R2 版本可能需要透過安裝 WMF 來取得。

安裝 PowerShell Core

PowerShell Core 可以與 PowerShell 共存不會有問題下載安裝就不多介紹,最簡單就是下載 MSI 安裝檔回來按【下一步】【下一步】就完成了。

如果希望能自動更新至最新版本的 PowerShell Core 那麼可以考慮 Chocolatey 來安裝與更新。

choco install powershell-core
choco upgrade powershell-core

執行 pwsh.exe

Run PowerShell 6

PowerShell Core 的預設進入點pwsh.exe,PowerShell 是 powershell.exe

在使用 Windows 預設命令提示字元視窗下執行 pwsh.exe,您一定會發現在輸入 PowerShell Core 指令時視窗會一直跳動。我目前知道的解決有二種:

  1. 改用 cmder
  2. 改用 Windows Terminal

Windows Terminal 可以利用 Windows StoreChocolatey 來安裝。Windows Terminal 目前系統限制比較高一些,需要 Windows 10 version 1903 才能執行。

choco install microsoft-windows-terminal
choco upgrade microsoft-windows-terminal

ConvertTo-Json 的 Datetime 問題

來看看一段實務上 PowerShell Script 的需求,我需要把資料源的資料轉換為 JSON 格式,下列舉列是在 PowerShell 利用 ConvertTo-Json 轉換來的結果:

PS C:\> (Get-UICulture).Calendar | ConvertTo-Json

{
    "MinSupportedDateTime":  "\/Date(-62135596800000)\/",
    "MaxSupportedDateTime":  "\/Date(253402271999999)\/",
    "AlgorithmType":  1,
    "CalendarType":  1,
    "Eras":  [
                 1
             ],
    "TwoDigitYearMax":  2029,
    "IsReadOnly":  false
}

看到好不見的 "\/Date(…)\/" 格式。

PS C:\> (Get-UICulture).Calendar | ConvertTo-Json | ConvertFrom-Json


MinSupportedDateTime : 0001/1/1 上午 12:00:00
MaxSupportedDateTime : 9999/12/31 下午 03:59:59
AlgorithmType        : 1
CalendarType         : 1
Eras                 : {1}
TwoDigitYearMax      : 2029
IsReadOnly           : False

就 PowerShell 本身的處理而言,"\/Date(…)\/" 格式並不會造成影響,但問題是前面轉換好的 JSON 最終是要提供給第三方使用,我想,對方如果看到這個值,應該會抓狂。哈哈。自己試了好久,一直無法突破那個 "\/Date(…)\/" 格式,我想在轉換後直接轉成時間格式,但在文件看到:

Notes:The ConvertTo-Json cmdlet is implemented by using the JavaScriptSerializer class.

心就灰了一半。在帶著嘗試的心態,把 pwsh.exe 打開來測試:

PS C:\> (Get-UICulture).Calendar | ConvertTo-Json
{
  "MinSupportedDateTime": "0001-01-01T00:00:00",
  "MaxSupportedDateTime": "9999-12-31T23:59:59.9999999",
  "AlgorithmType": 1,
  "CalendarType": 1,
  "Eras": [
    1
  ],
  "TwoDigitYearMax": 2029,
  "IsReadOnly": true
}

疑,我是不是看錯了,是通用的 ISO 8601,將 PowerShell 文件切換至 PowerShell 6 看到:

Notes:The ConvertTo-Json cmdlet is implemented using Newtonsoft Json.NET.

Yes,原來 PowerShell Core 改用 Json.NET 來處理(反)序列化。換成 PowerShell Core 之後,原本在 PowerShell 難解的問題,立馬解決。

PowerShell or PowerShell Core

這種核心小小的差異,真的只有用到才會知道差異,如果是比較偏 Windows 專屬的 cmdlet,還是 PowerShell 比較完整。但如果是相同指令,由於 PowerShell Core 由於重新設計過,我覺得會比較完善,例如,我經常使用的 Invoke-WebRequest,左邊是 PowerShell 版本,右邊是 PowerShell Core 版本:

Invoke-WebRequest PS PSCore Compare

我們能很清楚看到 PowerShell Core 能指定的參數就多了許多。也就是說,如果非 Windows 專屬的 cmdlet,那麼可以考慮使用 PowerShell Core 以取得更大的彈性。

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。