Board logo

标题: [推荐] Power Shell 出现了,Windows 与 Unix 的距离还有多远? [打印本页]

作者: qzwqzw     时间: 2007-5-16 18:41    标题: [推荐] Power Shell 出现了,Windows 与 Unix 的距离还有多远?

来源下一代Shell脚本语言,Windows Power Shell!
作者Zealic


  今天回家照常浏览了下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在运行前是以非托管代码执行了必要的初始化,然后才进入CLR的,也可能是建立一个混合环境,方面托管和非托管代码交互执行;那么,宿主程序在哪呢?


   用 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所接管了,那么现在要做的就是把目录里面的文件弄出来,我先后尝试了对话框,复制文件夹,未果,最后用一条命令行搞定了:
[size=13px]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:
      使用 输出命令
[size=13px]Write-Output "Hello World!"
      使用 .Net 来输出
[size=13px][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 的距离在拉近。
作者: wjxsjd     时间: 2007-5-16 21:07
学习!
作者: qkl12345     时间: 2007-6-3 13:31
是的感觉微软在和UNIX的SHELL较量,虽然微软说自己的PS还不成熟
作者: driver1998     时间: 2008-5-30 16:55
看来微软放弃dos,反而抄起了unix。
作者: wwwcccyyy     时间: 2008-6-2 18:03
有可能么.
作者: cjm7065     时间: 2008-7-27 12:50
比较专业看不太明白!
作者: bailang3106     时间: 2008-9-24 17:09
批处理的功能比linux  shell少多了   也该动动了
作者: ifly     时间: 2008-10-12 16:43
介绍很详细,学习了
作者: fjke     时间: 2008-11-4 09:50
很惭愧,看不太懂
作者: listme07     时间: 2008-11-13 12:34
study beginning
作者: speedide     时间: 2008-11-23 00:01
WINDOWS總是要兼容之前的產品的....
現在看來WINDOWS7還是用的NT內核...

雖然我不懂編程.但是我覺得WINDOWS服務器的一個優勢就是設置很方便.且功能也很強大.
如果真的出無一個不使用圖形界面的內核.要麼就要將過去的很多產品重寫(另寫一套產品或者寫一份命令行的程序再寫圖形程序來做前段都是很恐怖的....)

雖然網上有那個MIN WIN的內核視頻.不過像這樣的公司是不是真的會去用也要看公司怎麼發展了.
看看現在微軟所有的產品......列表那麼長....

不知道誰能給他們解決這個問題....