下一代Shell腳本語言,Windows Power Shell!
今天回家照常瀏覽了下cnbeta.com,看看有什么新鮮的內(nèi)容。
于是乎,就看到了那么一條 Windows Power Shell 1.0
恩,我對這個東西很感興趣,畢竟Windows目前的Shell是在是太弱了,立馬從微軟站點下載,安裝,發(fā)現(xiàn)其是以補丁包的形式發(fā)布的,并非常規(guī)的MSI,那么,我估計Vista已經(jīng)自帶了這個東西了。
下面將嘗試了解PowerShell(以下簡稱PS)
安裝完成后,打開程序菜單,看來M$習慣還是保持的不錯的,幫助很詳細
發(fā)行說明
快速參考
入門
用戶指南
其他不做細表
看過文檔以后,發(fā)現(xiàn)比較重要的一點是,PS是用.Net編寫,并且完全支持.Net的任何對象。
.Net!什么?
祭出屠龍刀 Reflector 打開 PowerShell的主程序及目錄下的所有DLL,失?。篊LR頭無效,沒有一個被正確反編譯了的,不是說用PS是由 .Net編寫的么?怎么...M$在忽悠我們?
那他是如何操作.Net對象的呢?
那么再來,祭出PE Explorer 打開 PS的主程序 看了下其API導入,發(fā)現(xiàn) PS 的主程序。
引用了mscoree.dll 的函數(shù) CorBindToRuntimeEx
MSDN是這樣解釋 CorbindToRuntimeEx 的 : 使非托管主機能夠?qū)⒐舱Z言運行庫加載到進程中。
這說明了PS在運行前是以非托管代碼執(zhí)行了必要的初始化,然后才進入CLR的,也可能是建立一個混合環(huán)境,方面托管和非托管代碼交互執(zhí)行;那么,宿主程序在哪呢?
用 Windows 的搜索功能搜索關(guān)鍵字 "PowerShell",失敗,找出來的全部是程序目錄里的東西!~~~
仔細想了一下,決定從根源著手;Windows的補丁程序是使用CAB打包的,因此可以直接用 WinRAR打開,用WinRAR打開 WindowsXP-KB926140-x86-CHS.exe,找到了我需要的東西 "_sfx_manifest_",用文本格式打開查看,發(fā)現(xiàn)了一些我需要的東西:
"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.",文件頭不對;用記事本打開看看,發(fā)現(xiàn)文件頭居然為 "PA19",這是什么格式的文件,為什么我從來沒有見過?NGEN生成的本地代碼?或者是加密過的Managed DLL?
先不管這個,找其他辦法弄出 GAC里面的程序集好了。
GAC目錄已經(jīng)被一個 Shell Extension所接管了,那么現(xiàn)在要做的就是把目錄里面的文件弄出來,我先后嘗試了對話框,復制文件夾,未果,最后用一條命令行搞定了:

然后在拷貝出來的目錄中尋找需要的程序集。哈,現(xiàn)在我們可以看PS的代碼了,這將是很愉快的一件事。
另外,我通過 _sfx_manifest_ 文件和 Reflector 分析程序集引用發(fā)現(xiàn)多了一個程序集 "System.Management.Automation.dll",其EXE備注為"Microsoft Command-Line Shell Engine Core Assembly"
我將這些解出來的程序集打包上傳,點這里下載,我們可以Reflector分析他的代碼,或者將他和PS的主程序一起打包用以實現(xiàn) XCOPY 部署,用以做為產(chǎn)品的腳本系統(tǒng)。
到這里,我們已經(jīng)把代碼程序集都搞出來了,我們來看一下 PowerShell 到底是什么東西,能做什么:
由于以下原因,Windows PowerShell 使用它自己的語言,而不是重用現(xiàn)有的語言:
•Windows PowerShell 需要用于管理 .NET 對象的語言。
•該語言需要為使用 cmdlet 提供一致的環(huán)境。
•該語言需要支持復雜的任務(wù),而不會使簡單的任務(wù)變得更復雜。
•該語言需要與在 .NET 編程中使用的高級語言(如 C#)一致。
PS語言的一些特性:
1.高級語言的部分特性(變量、數(shù)組、運算符、哈希表、函數(shù),條件語句,循環(huán)語句...)
2.能直接在文件系統(tǒng)、注冊表、證書存儲區(qū)、驅(qū)動器中導航,而導航方式和我們熟悉的DOS導航方式極相似。
3.強大的通配符和字符串搜索功能
4.可以創(chuàng)建和操作.Net對象 和 COM 對象
5.基于對象管道功能使用任何對象(包括.Net和COM對象)與目標交互
7.可以直接訪問 WMI 對象。
8.可以編寫 .Net 程序集來擴展PS,通過擴展,幾乎可以無限的擴充 PS 的功能。
其他特性請參考PowerShell的幫助文檔。
常見的命令:
Get-Date - 獲得當前日期。
Get-Help - 獲取幫助。
Get-Member - 查看對象結(jié)構(gòu)(可用此命令查看 .Net 對象的成員)。
Get-WmiObject - 獲取 WMI 對象。
Get-Process - 獲取進程對象。
Get-Service - 獲取Windows服務(wù)對象。
現(xiàn)在已經(jīng)是月黑風高催人眠,只能等明天繼續(xù)研究了;最后,我們以經(jīng)典的 Hello World 來結(jié)尾吧,明天,我們再來進一步研究 PS:
使用 輸出命令

使用 .Net 來輸出


真是強大的Shell!
PS:
我一直都希望M$能夠提供一個無圖形界面的,從目前看來似乎是時間還早了,但是現(xiàn)在是朝著好的方向發(fā)展,PowerShell讓我看到了希望,說不定PowerShell就是將來的無圖形界面 Server 的雛形。
所以,我大膽預(yù)測,Vienna(繼Vista之后的下一個OS,完全重寫內(nèi)核)將會是內(nèi)核和圖形界面分離,而非現(xiàn)在基于NT的內(nèi)核,內(nèi)核與圖形界面將湊在一起;并且將會有一個無圖形界面的Server和目前的圖形Server,兩者將在很長一段時間內(nèi)并存,至于誰會被取代,我覺得似乎是沒可能了。
因此,我能想象的到的東西大概是,微軟會將 Windows PE 升級,使其使用 Vienna 的核心,并且將會包含 .Net Framework X.Y,同時分為字符界面和圖形界面。這樣,Windows PE 將會成為一個極為順手的系統(tǒng)診斷、故障排除工具。
Windows Server 在和 Unix/Linux Server 的距離在拉近。
相關(guān)文章
互聯(lián)網(wǎng)寒冬來臨 企業(yè)節(jié)流有訣竅
今年下半年,由次貸危機引起的金融危機波及全球,對大部分企業(yè)產(chǎn)生了許多不利影響,許多企業(yè)出現(xiàn)了資金周轉(zhuǎn)困難的情況,因此“開源節(jié)流”成為眾多企業(yè)的生存手段。2008-11-112月份停止Google Adsense下線推介 將在中國地區(qū)停止投放
2008-01-01域名深耕電子商務(wù) 幫助企業(yè)厚積而薄發(fā)
2009-07-07