php 的shell脚本语言,下一代Shell脚本语言,Windows Power Shell!

今天回家照常浏览了下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所接管了,那么现在要做的就是把目录里面的文件弄出来,我先后尝试了对话框,复制文件夹,未果,最后用一条命令行搞定了:

f0cd6c7f9e7ae96feae062cb48f670f0.pngxcopy/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:

使用 输出命令

f0cd6c7f9e7ae96feae062cb48f670f0.pngWrite–Output"Hello World!"

使用 .Net 来输出

f0cd6c7f9e7ae96feae062cb48f670f0.png[System.Console]::ForegroundColor=[System.ConsoleColor]::Blue

f0cd6c7f9e7ae96feae062cb48f670f0.png[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 的距离在拉近。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值