下一代Shell脚本语言,Windows Power Shell!_IT 业界

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

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 的距离在拉近。

时间: 2024-12-31 05:14:47

下一代Shell脚本语言,Windows Power Shell!_IT 业界的相关文章

windows power shell 集采sql sever 相关性能

问题描述 windows power shell 集采sql sever 相关性能 # 用windows power shell 采集sql sever 的相关性能信息,并显示出来,写一个脚本.比如sql sever的全表扫描/秒,page splits/sec等信息. 解决方案 http://blog.csdn.net/zhaowenzhong/article/details/7211829 解决方案二: http://www.cnblogs.com/stswordman/archive/20

将PHP作为Shell脚本语言使用

脚本 本文出自:http://phpuser.com 作者: y10k翻译 (2002-10-15 06:02:00) --英文原著:Darrell Brogdon,发表于 http://www.phpbuilder.com/columns/darrell20000319.php3) 可能很多人都想过使用PHP编写一些定时发信之类的程序,但是却没有办法定时执行PHP:一次去PHPBuilder的时候,发现了这一篇文章,于是想给大家翻译一下(同时做了一些修改),希望对大家有用.第一次翻译文章,不好

将PHP作为Shell脚本语言使用_php基础

我们都知道,PHP是一种非常好的动态网页开发语言(速度飞快,开发周期短--).但是只有很少数的人意识到PHP也可以很好的作为编写Shell脚本的语言,当PHP作为编写Shell脚本的语言时,他并没有Perl或者Bash那么强大,但是他却有着很好的优势,特别是对于我这种熟悉PHP但是不怎么熟悉Perl的人. 要使用PHP作为Shell脚本语言,你必须将PHP作为二进制的CGI编译,而不是Apache模式:编译成为二进制CGI模式运行的PHP有一些安全性的问题,关于解决的方法可以参见PHP手册(ht

如何短时间内学好一门语言 shell脚本语言为例_linux shell

这里我分享的是学习计算机shell脚本语言的方法,可能你不是在软件行业,但我建议也看看,因为我并没有讲什么技术细节,主要分享的是提炼出的通用性方法,这是对学习任何东西都是有用的. 当然,如果你好奇心足够强的话,建议也可以按照下面的方法来尝试一下,因为科学家已经预测:以后的世界就是一个软件定义的世界,机器人和人工智能会非常普及,而支持它们运行的除了我们看得见的硬件,最关键的就是里面的软件. 所以,学会编程以后就不仅仅只是软件从业人员需要掌握的技能,任何人都可以掌握它,既可以用它来不断提高工作效率,

Linux Shell脚本实现检测tomcat_linux shell

Linux Shell脚本检测tomcat并自动重启 后台运行命令 sh xxx.sh & 查看后台任务:jobs 召唤到前台:fg jobs编号 可以删掉while循环的代码放到crontab里面定时执行,可以将脚本直接后台运行, #!/bin/bash while [ true ] do url="http://www.jb51.net/"; httpOK=`curl --connect-timeout 10 -m 60 --head --silent $url | awk

使用shc工具加密shell脚本详解_linux shell

Shc可以用来对shell脚本进行加密,可以将shell脚本转换为一个可执行的二进制文件.经过shc对shell脚本进行加密后,会同时生成两种个新的文件,一个是加密后的可执行的二进制文件(文件名以.x结束),另一个是C语言的原文件(文件名以.x.c结束).   下面就说明一下shc的安装,参数,以及使用示例: 下载安装: (官网下载地址: http://www.datsi.fi.upm.es/~frosal/sources/) 复制代码 代码如下: # wget http://www.datsi

Shell脚本注释写法_linux shell

一.单选注释 以"#"开头的行就是注释,会被解释器忽略. 复制代码 代码如下: #-------------------------------------------- # 这是一个自动打ipa的脚本,基于webfrogs的ipa-build书写: # https://github.com/webfrogs/xcode_shell/blob/master/ipa-build # 功能:自动为etao ios app打包,产出物为14个渠道的ipa包 # 特色:全自动打包,不需要输入任

统计网卡流量的两段shell脚本(使用ifconfig)_linux shell

使用shell脚本计算Linux网卡流量,方法中最关键点: 复制代码 代码如下: ifconfig $eth_name | grep bytes | awk '{print $6}' | awk -F : '{print $2}' 通过ifconfig eth0|grep bytes 得到输入输出的流量. 复制代码 代码如下: /@rac2=>dd2$ifconfig eth0|grep bytes RX bytes:1638005313300 (1.4 TiB) TX bytes:340806

用于检测进程的shell脚本代码小结_linux shell

一个简单的shell脚本,用来找出关键的服务是否正在运行,适用于Linux或Unix操作系统.该脚本还可以使用电子邮件发送通知. 代码: 复制代码 代码如下: #!/bin/bash# Name : service.chk 服务检测脚本## 根据自己的环境修改_pgrep="/usr/bin/pgrep"_mail="/usr/bin/mail" ## 环境变量_chklist="/usr/bin/php-cgi /usr/sbin/nginx /usr/