Windows PowerShell是專為系統管理員設計的Windows命令列Shell,包括一個互動式的DOS風格命令列視窗和腳本環境,能夠獨立或聯合應用程式。與大多數接收和發送文字訊息的Shell不同,Windows PowerShell是建立在.NET common language runtime和.NET Framework基礎之上,接收和回應.NET物件。這樣的特性為Windows的管理和配置提供了新的工具和方法。
PowerShell
Windows PowerShell中的一個重要概念是“cmdlet”,一個建構在Shell的簡單的、單一功能的命令列工具。使用者可以獨立的使用其中的命令,但是其作用依賴於應用的任務和環境。 Windows PowerShell包含超過100條的基本命令列,使用者可以自行編寫命令列並共用給其他的使用者。
和大多數Shell相似,Windows PowerShell讓你有權存取電腦的檔案系統,此外,Windows PowerShell可以讓你存取其他儲存數據,例如登錄和數位簽章憑證等,就像存取檔案系統一樣簡單。
Windows Server 2008 R2中的PowerShell升級到2.0,引進了許多新的特性,例如遠端管理、完整的腳本環境、Debug工具等等,以下我們來具體了解PowerShell V2中ISE和增強遠端功能的新特性。
1.整合的腳本環境ISE(Integrated Script Environment)
對於PowerShell的一個基本需求是能夠簡單的編寫和偵錯PowerShell腳本,PowerShell v2捆綁了一個整合的腳本環境ISE(Integrated Script Environment),讓編寫PowerShell腳本更容易,ISE包含了一個腳本面板、一個輸出面板和一個命令列面板。
ISE面板
ISE的命令列面板和PowerShell命令列面板非常類似,使用者可以在裡面敲入命令,並透過回車來執行命令。指令的執行結果會顯示在輸出面板中,可以清楚的追蹤之前所有指令執行的結果。頂部的腳本面板可以用來編寫和偵錯腳本,腳本面板支援多個腳本共同操作,操作便捷。
為了幫助使用者偵錯腳本,ISE允許使用者以多種方式設定調試中斷點(breakpoint),可以手動設置,或在某一特殊條件下自動設置,後者提供了更好的操作體驗。在設定中斷點的命令中,使用者需要指定偵錯腳本的名稱和座標。
Set-PSBreakpoint .[Script-File-Name].ps1 -line X
如果要設定多個中斷點,指定座標的時候需要用逗號隔開,如
Set-PSBreakpoint .[Script-File-Name].ps1 -line X,Y,Z
如果要在呼叫特定函數時設定中斷點,則需要使用到Set-PSBreakpoint指令,和-Command參數,以及函式名稱:
Set-PSBreakPoint -Command [Name-Of-Function]
ISE的偵錯器還可以在讀取和寫入特定變數時設定中斷點,以下是在讀寫變數時設定中斷點的命令:
Set-PSBreakpoint -Variable [Variable-Name] -mode read
Set-PSBreakpoint -Variable [Variable-Name] -mode write
中斷點被設定後具有唯一的標識符,可以透過Disable-PSBreakpoint命令,刪除標識符來刪除中斷點:
Disable-PSBreakpoint X
2、PowerShell v2的遠端功能增強
PowerShell v2的另一個重要特性是遠端操作能力(PowerSell remoting)的增強,增加了新的命令列Invoke-Command。要注意的是,PowerSell remoting目前只能支援執行Vista SP1、Windows Server 2008以及Windows 7的計算機,而且需要安裝對應版本的遠端管理工具WinRM。這表示使用者只能透過PowerShell remoting連接安裝PowerShell v2和WinRM的Vista SP1/Win 2008計算機,並且不支援Vista(只能安裝PowerShell)和WinXP系統的計算機。
PowerShell v2系統需求與改進
在PowerShell 2.0的CTP預發布版本中,Invoke-Expression指令用來連接遠端電腦:
Invoke-Expression –computerName atl-fs-001 –command Get-Process
而如果使用者想要執行遠端電腦atl-fs-001 上的Get-Process指令,可以採用新的Invoke-Command指令:
Invoke-Command –computerName atl-fs-001 –scriptblock
可以看到兩個命令中基本參數是一樣的,PowerShell團隊用Invoke-Command取代了Invoke-Expression命令,用–scriptblock參數取代了–command,雖然在命令上看到改動並不多,但增進了遠程操作的穩定性、安全性和效能。
當然,這條命令還可以支援多台遠端計算機,如果需要從遠端計算機atl-fs-001, atl-fs-002, 和atl-fs-003上獲得進程信息,可以使用命令:
Invoke-Command –computerName atl-fs-001, atl-fs-002, atl-fs-003 –scriptblock
支援多台遠端計算機
和Invoke-Expression指令一樣,Invoke-Command可以連接遠端計算機,執行指令,但會立即失去連線。如果需要和遠端電腦的一個持續連接,可以透過命令建立一個PowerShell會話:
$objRunspace = New-Runspace atl-fs-001, atl-fs-002, atl-fs-003
如果需要獲得更多有關Invoke-Command命令的信息,可以透過下面這個命令獲得說明和範例:
Get-Help Invoke-Command –full | more