今天回家照常瀏覽了下cnbeta.com,看看有什麼新鮮的內容。
於是乎,就看到了那麼一條 Windows Power Shell 1.0
恩,我對這個東西高度興趣,畢竟Windows目前的Shell是在是太弱了,立馬從微軟網站下載,安裝,發現其是以補丁包的形式發布的,並非常規的MSI,那麼,我估計Vista已經內建了這個東西了。
下面將嘗試瞭解PowerShell(以下簡稱PS)
安裝完成後,開啟程式菜單,看來M$老習慣還是保持的不錯的,協助很詳細
版本資訊
快速參考
入門
使用者指南
其他不做細表
看過文檔以後,發現比較重要的一點是,PS是用.Net編寫,並且完全支援.Net的任何對象。
.Net!什嗎?
祭出屠龍刀 Reflector 開啟 PowerShell的主程式及目錄下的所有DLL,失敗:CLR頭無效,沒有一個被正確反編譯了的,不是說用PS是由 .Net編寫的嗎?怎麼...M$在忽悠我們?
那他是如何操作.Net對象的呢?
那麼再來,祭出PE Explorer 開啟 PS的主程式 看了下其API匯入,發現 PS 的主程式。
引用了mscoree.dll 的函數 CorBindToRuntimeEx
MSDN是這樣解釋 CorbindToRuntimeEx 的 : 使非受管理的主機能夠將公用語言運行庫載入到進程中。
這說明了PS在運行前是以Unmanaged 程式碼執行了必要的初始化,然後才進入CLR的,也可能是建立一個混合實境世界,方面託管和Unmanaged 程式碼互動執行;那麼,宿主程式在哪呢?
用 Windows 的搜尋功能搜尋索引鍵 "PowerShell",失敗,找出來的全部是程式目錄裡的東西!~~~
仔細想了一下,決定從根源著手;Windows的補丁程式是使用CAB打包的,因此可以直接用 WinRAR開啟,用WinRAR開啟 WindowsXP-KB926140-x86-CHS.exe,找到了我需要的東西 "_sfx_manifest_",用文字格式設定開啟查看,發現了一些我需要的東西:
"microsoft.powershell.consolehost.dll" = "_sfx_0008._p", "powershell.exe"
"system.management.automation.dll" = "_sfx_0009._p", "microsoft.powershell.consolehost.dll"
"microsoft.powershell.security.dll" = "_sfx_0010._p", "system.management.automation.dll"
......
這充分說明了,宿主程式是存在的,它就是 Microsoft.PowerShell.ConsoleHost.dll,那麼,為什麼我找不到這些檔案呢?
再考慮以下,覺得這些東西可能在 GAC 中,開啟GAC目錄查看;哈,他們都在那呢?
但是用 Reflector 仍然有問題!Reflector 找不到這些程式集~~~,用 Open Cache 同樣找不到!!!
沒法,就從補丁包裡把檔案解出來看吧,弄出來再用 Reflector 開啟,傻了,"File is not a portable executable. DOS header does not contain 'MZ' signature.",檔案頭不對;用記事本開啟看看,發現檔案頭居然為 "PA19",這是什麼格式的檔案,為什麼我從來沒有見過?NGEN產生的本地代碼?或者是加密過的Managed DLL?
先不管這個,找其他辦法弄出 GAC裡面的程式集好了。
GAC目錄已經被一個 Shell Extension所接管了,那麼現在要做的就是把目錄裡面的檔案弄出來,我先後嘗試了對話方塊,複製檔案夾,未果,最後用一條命令列搞定了:
xcopy /e C:\Windows\assembly\GAC_MSIL G:\GAC_MSIL
然後在拷貝出來的目錄中尋找需要的程式集。哈,現在我們可以看PS的代碼了,這將是很愉快的一件事。
另外,我通過 _sfx_manifest_ 檔案和 Reflector 剖析器集引用發現多了一個程式集 "System.Management.Automation.dll",其EXE備忘為"Microsoft Command-Line Shell Engine Core Assembly"
我將這些解出來的程式集打包上傳,點這裡下載,我們可以Reflector分析他的代碼,或者將他和PS的主程式一起打包用以實現 XCOPY 部署,用以做為產品的指令碼系統。
到這裡,我們已經把代碼程式集都搞出來了,我們來看一下 PowerShell 到底是什麼東西,能做什麼:
由於以下原因,Windows PowerShell 使用它自己的語言,而不是重用現有的語言:
•Windows PowerShell 需要用於管理 .NET 對象的語言。
•該語言需要為使用 cmdlet 提供一致的環境。
•該語言需要支援複雜的任務,而不會使簡單的任務變得更複雜。
•該語言需要與在 .NET 編程中使用的進階語言(如 C#)一致。
PS語言的一些特性:
1.進階語言的部分特性(變數、數組、運算子、雜湊表、函數,條件陳述式,迴圈語句...)
2.能直接在檔案系統、註冊表、憑證存放區區、磁碟機中導航,而導航方式和我們熟悉的DOS導航方式極相似。
3.強大的萬用字元和字串搜尋功能
4.可以建立和操作.Net對象 和 COM 物件
5.基於對象管道功能使用任何對象(包括.Net和COM對象)與目標互動
7.可以直接存取 WMI 對象。
8.可以編寫 .Net 程式集來擴充PS,通過擴充,幾乎可以無限的擴充 PS 的功能。
其他特性請參考PowerShell的協助文檔。
常見的命令:
Get-Date - 獲得當前日期。
Get-Help - 擷取協助。
Get-Member - 查看對象結構(可用此命令查看 .Net 對象的成員)。
Get-WmiObject - 擷取 WMI 對象。
Get-Process - 擷取進程對象。
Get-Service - 擷取Windows服務物件。
現在已經是月黑風高催人眠,只能等明天繼續研究了;最後,我們以經典的 Hello World 來結尾吧,明天,我們再來進一步研究 PS:
使用 輸出命令
Write-Output "Hello World!"
使用 .Net 來輸出
[System.Console]::ForegroundColor = [System.ConsoleColor]::Blue
[System.Console]::WriteLine("Hello World!")
真是強大的Shell!
PS:
我一直都希望M$能夠提供一個無圖形介面的,從目前看來似乎是時間還早了,但是現在是朝著好的方向發展,PowerShell讓我看到了希望,說不定PowerShell就是將來的無圖形介面 Server 的雛形。
所以,我大膽預測,Vienna(繼Vista之後的下一個OS,完全重寫核心)將會是核心和圖形介面分離,而非現在基於NT的核心,核心與圖形介面將湊在一起;並且將會有一個無圖形介面的Server和目前的圖形Server,兩者將在很長一段時間內並存,至於誰會被取代,我覺得似乎是沒可能了。
因此,我能想象的到的東西大概是,微軟會將 Windows PE 升級,使其使用 Vienna 的核心,並且將會包含 .Net Framework X.Y,同時分為字元介面和圖形介面。這樣,Windows PE 將會成為一個極為順手的系統診斷、故障排除工具。
Windows Server 在和 Unix/Linux Server 的距離在拉近。