初次接觸 PowerShell 緣於專案需求:使用腳本管理 Hyper-V 的作業系統與服務部署、還原。在評估多種方案後,選擇了當時正夯的 PowerShell,搭配開源庫 PSHyperV 與免費 IDE PowerGUI 极速上手。以下整理出讓我「驚艷」的五大核心特性,也是後續深入探索的動力來源。
WMI (Windows Management Instrumentation) 在 PowerShell 中不再是繁瑣的 System.Management 呼叫,而是原生指令 Get-WmiObject (或 CIM 指令 Get-CimInstance)。配合 WQL 查詢,無論是查詢遠端電腦時間、控制服務、設定 IIS,還是操作 Hyper-V 虛擬機,皆能以一致的物件導向方式處理。無 WMI,PowerShell 就不「Power」。
PowerShell 以 [xml] 型別加速器將 XML 文件直接轉為 XmlDocument 物件,節點屬性化存取:
[xml]$content = Get-Content test.xml
$value = $content.dataroot.abc.cde # 直接取得節點文字
底層仍是標準 XmlDocument,享有完整 DOM 功能,卻擁有類動態語言的便利語法。微軟慣用的「犧牲效能換取開發效率」策略在此淋漓盡致。
透過 Provider 機制,環境變數與登錄表被映射為磁碟機:
$env:COMPUTERNAME 直接讀寫環境變數。dir HKLM:\Software 如同瀏覽檔案系統般操作登錄表。Set-Item、New-ItemProperty 等通用指令,零學習成本切換資料存儲。$files = dir 取得的不是字串清單,而是 FileInfo/DirectoryInfo 物件陣列。$files.GetType() 顯示 Object[],每個元素擁有完整屬性與方法(Length、CreationTime、Delete() 等)。這徹底改變了傳統 Shell 「文字解析」的痛點,也是 PowerShell 區別於 Bash、CMD 的核心哲學。
繼承 Cmdlet 基類撰寫 Snapin,經 InstallUtil 安裝、Add-PSSnapin 載入後,自訂指令即擁有:
Get-Help、-Full、-Examples 等完整契約。ValidateNotNullOrEmpty、ValidateRange 等聲明式驗證。ValueFromPipeline、ValueFromPipelineByPropertyName 只需屬性標註。這遠超腳本函數的能力邊界,是構建企業級自動化框架的基石。
彩蛋:推薦一首 PowerShell 之歌,聽完心情更佳。