PowerShell初探


    一个朋友带的学生的毕业设计课题是PowerShell,要我帮忙看一下,这才第一次接触PowerShell概念,顺便谈谈对Shell和脚本语言的一些理解,最近没研究这些内容,先占个位置,写点第一感觉,有些观点会完全错误,以后有时间逐步完善。

一、越来越精彩的脚本语言世界

    脚本语言的概念应该是相对传统高级语言而言如C而言的,脚本语言也是一类高级语言,可以用来扩展系统或者应用的功能(嵌入式语言----嵌入到宿主环境里)。现在很多系统、应用或者服务的已经足够复杂(数据库的SQL、SAP的ABBA、游戏里面的Lua、MapInfo里的MapBasic、Office里面的宏语言、更别提层出不穷的Web脚本语言、Google 等Web服务API),带动了脚本语言的发展,其和传统高级语言的界限已经逐渐模糊,脚本语言和严肃的高级编程语言的主要区别在于:(1) 是否强类型和静态类型定义,这意味着所有变量的类型要在程序中指定,在编译时检查;(2) 是编译执行还是解释执行,后者可以编译为二进制(字节码),所以脚本语言可以是交互式执行的;(3)和上面2点相关,脚本语言一般语法不是那么严格,特别是不用操心内存分配问题,比较容易编写、立即执行与验证。

John K. Ousterhout(Tcl/Tk 的创造者)曾在 “Scripting: Higher Level Programming for the 21st Century” 一文提出他的看法,他认为脚本语言的主要目的,是在「黏合」(glue)现有的软件组件,而因为图形操作接口、因特网、组件应用框架(component frameworks)的崛起,需要有更多、更好的脚本语言来黏合(因此脚本语言也称为「黏合语言」(glue languages)或「系统整合语言」(system integration languages)。

     脚本语言本身能力的增进,以及计算机硬件的速度越来越快,也都是促进脚本语言蓬勃发展的原因。简单、易学、易用的脚本语言尤其适合专责系统或网络管理的 IT 人员,因为脚本语言的起源就是为了便利系统操作,而且操作系统的供应者也都会加强这部份的功能,提供更简易的语法、更丰富的组件,让IT 人员更易于「黏合」各项功能,而组合出绝对适合自身需要的脚本程序。

 

二、windows Shell脚本的历史

       1. DOS—windows9X年代:BAT文件

       微软最初并没有意识到命令行工具在图形化界面操作系统中的重要性,因此只有cmd这样的工具,实际上BAT还是有一点基本的程序特性的(比如跳转,条件判断),只是很多人完全忽视了。看看《Windows系统管理之道--命令行脚本应用与解决方案》就知道很多管理工作还是可以批处理的。

 

2. COM年代:WSH脚本宿主

微软后来又推出WSH(Windows Script Host)来解决批处理脚本的问题,它为 Windows 平台提供了简单、功能强大而又灵活的脚本编写功能,如脚本登录、脚本管理和计算机自动化。Windows 脚本宿主得益于com技术的支持,为直接操纵脚本执行提供了若干个对象,包括功能强大复杂的WMI对象,并为其他操作提供了 helper 函数。Windows 脚本宿主内嵌在 Microsoft Windows 98/Me、2000/XP/2003中,最新的是5.7版本。不过由于微软并没有突出推广以及学习门槛太高而没有得到相应的重视。《Windows 脚本编程核心技术精解》充分展示了WSH的强大功能。

 

3. .NET年代:Windows PowerShell

Microsoft意识到UNIX shell的流行,它在.NET框架中融合了对象pipeline概念,产生了WPS,第一个beta版本在2003.11的PDC上展示,名为Monad,中间还称为Microsoft Shell(MSH),到2006.5就称为PowerShell。第一个版本WPS 1.0在2007.11.11发布。

PowerShell最初的蓝本是Posix的shell标准, 并借鉴了大量的Perl语言中精华, 提供了一个基于对象的脚本环境。那么为什么不使用已有的shell或扩展cmd.exe呢? 我们熟知的bash, ksh是为unix,linux系统设计的, 优化的shell, 从这些操作系统内核提供的systemcall来看, shell将内核的特性真正表现出来. 但是, Windows操作系统和unix, linux是完全不同的, Windows将大部分管理通过面向对象的方式进行管理, 提供了诸如COM, WMI等概念. PowerShell开发队伍为了能够为Windows提供更好的优化, 因此选择重新创建一门新语言。

PowerShell由于Ms的着力推销已经是最热门开发语言之一。IBM还率先发布用于管理WebSphere MQ的PowerShell命令(Cmdlet)。http://blogs.msdn.com/powershell/default.aspx

微软已经不遗余力地宣传PowerShell,并把它和其一些产品结合起来,称其为下一代的命令行脚本,用它来管理 IIS7、Exchange Server 2007,集成进Windows Server 2008。5.7版的 WSH 也不能直接调用 .NET 类库,说明微软不想搞出两个功能重复的东西,PowerShell受的关注将大于WSH,并慢慢放弃对WSH的支持。

 

三、PowerShell是什么

       1. PowerShell--微软最Power 的Shell

什么是Shell,传统意义上Shell是操作系统的外壳,也就是操作系统的管理界面(这里主要指CLI),Shell脚本语言就是在Shell里面执行的程序。UNIX 的世界有功能强大的shell,如Bash。

现在 Windows 环境也有了功能相当于BASH的PowerShell,以.NET 技术为基础,并且与现有的 WSH 、Windows 命令行工具保持回溯兼容,因此Windows PowerShell 的脚本程序不仅能存取 .NET CLR,也能使用现有的 COM 技术。

PowerShell是Windows Server 2008中的一个新特性,但是PowerShell并不是只能运行于Windows Server 2008中。在Windows XP,Vista或Server 2003中同样也可以使用PowerShell,只需要单独下载并安装一下PowerShell安装程序即可。Windows 7和其服务器产品Windows Server 2008 R2将内置PowerShell 2.0版本的解析器。第二版的PowerShell拥有增强的内置Visual Studio脚本开发环境(IDE),可以让管理更为方便和人性化,并且在扩展性,数据监测,授权上也作出了改进。

 

2. PowerShell的一些特点:

ü         内含上百种称为 cmdlet 的标准工具。可用来处理常见的系统管理工作如登录数据库、系统服务、形成、WMI、事件日志等等;Posix的ls,more,less,cat等命令一个不少;具备完整的扩充功能,独立软件商或开发者都能很容易的自行扩充。

ü         语言及工具支持。支持脚本化管理,并允许WPS宿主于程序中;强大的正则表达式功能;脚本工具中前所未有的追踪和调试能力;

ü         PowerShell语言是基于面向对象的。那么它可以与微软系统的其它软件友好衔接,这样,你就可以对其它软件进行脚本操作。访问COM,.NET框架和WMI的所有系统和程序对象。和其他Shell不同的是,PowerShell处理的对象.NET的对象,而不是一般*NIX中的文本文件,同系统结合更加致密,整体更加规范和易于操作。

 

3. Windows PowerShell组成

包括语言(language),命令集(cmdlets),供应(provider),对象(Object)四部分:

ü         language:实际上没有什么好说的,所有的shell都有自己的编程语言,PowerShell语言借鉴了Perl的一些东西(?)和并且C#比较接近

ü         cmdlets:命令集,很多第三方软件商也会提供各种对系统和应用的命令集;

ü         provider:给出Powershell可操作的对象如注册表,文件系统,环境变量,alias等

ü         Object:.NET的一个Class,包括属性、方法、行为,任何Powershell处理的对象都是一个.NET的Object。

 

四、关于Powershell的几个认识

1. 基于.Net对象

Powershell对Windows的管理方式是基于对象的,并且是基于.Net的对象的,但.Net框架目前还很弱(?),目前的主流程序还不是基于.Net的,等.Net逐渐成了Windows上的主流,Powershell就很有威力。刚开始用Powershell会觉得很难用,那是因为你是在按照Unix/Linux,按照Win2k3的思路去用,等你熟悉了它,你就会发现它的强大。

   --支持.Net是PowerShell相对其它Shell脚本的独特优势,但.Net本身也许是个扶不起的刘阿斗?!我和朋友开玩笑经常说.Net是软件史上最豪华最专业的垃圾产品。

 

2. 数据处理方式--与unix风格shell的区别

Unix的shell是完全的命令解释–文本处理这种流程来走的,将命令的输出文本进行有机加工,抽取有用的信息,再反馈到更多的命令使用中去,最后达到几乎是所有能想到的目的, 但是文本字符串也是你唯一能够操作的对象。

而PowerShell将命令的返回对象化了,也就是把命令返回的结果当作对象,进而调用或输出对象另外的方法或属性。Shell也能OO起来!好处是可以得到最精确最严谨的结果,而不会因为文本块的切割联合等问题费脑筋,也不会因为漏算某些情景导致奇怪操作结果。而坏处则是把用户的问题转给了cmdlet的开发商,一个适用性强的cmdlet是要设计者付出很大的心思才能做好的。

--这或许就是Unix哲学和Windows哲学的不同,《unix编程艺术》中反复阐述过的,“大教堂与集市”等文真是经典啊,应该再读一遍,加深理解。

 

3. Server Core 和 PowerShell 结合起来看

在Windows 2008 Server Core中不支持.Net Framework,所以无法安装Powershell,您可以使用“Windows管理规范”(WMI)或者使用PowerShell脚本来管理Server Core box。Ms正致力于做出一个关于.Net框架的合成版本,这将解决在Server Core未来版本中使用ASP.NET和PowerShell的问题。另外,我们还可以使用Unix的管理员们非常常用的一种方式:通过远程的命令行来管理Server Core box,类似于他们的“SSH”,其名称为“Windows远程Shell”。

--实际上这才是对PowerShell感兴趣的主要原因,用和Unix/Linux相似的方式管理Windows 服务器。但问题是如果没有了图形界面,Windows Server比Linux/Unix的优势在哪里呢?按照微软以前的策略,只会推出一些吸引unix/linux的用户的东西的,而不会变得和unix/linux一样,毕竟完全不是一个指导思想和操作模式。难道新的首席架构师掌权后微软真的改变了吗?总之,这个意义还是比较深远的,以我们的眼光现在还无法看清楚。

 

4. PowerShell真的很简单吗?

脚本语言语法本身一般都很简单,但结合到宿主环境中就往往就并不简单,拿JavaScript来说,熟悉基本语法,写一些1+2+3+..+100的小程序,有高级语言基础的半天就可以学会,但JavaScript用在浏览器环境中就不那么简单了,需要对DOM模型比较熟悉才能用的好(尤其近来Google、Adobe之流把javascript玩的眼花缭乱,让我等大开眼界),用在Flash环境中,自然也要对Flash的对象模型比较了解。

同样,若要以脚本程序管理 Windows 系统,除了要熟悉脚本语言,当然也必须熟悉 Windows PowerShell 指令和 WMI,毕竟脚本语言的目的只是黏合这些现成的软件组件。,如果只是简单的用用, PowerShell真的是简单,但是想要完成各种管理功能,对于一般人来说是个灾难,估计那些对象的参考有好几本书呢,再加上.net本身就有很多的类。

--实际上,可以把PowerShell看作是和C#、VB.NET一样的.Net语言,不过它总是运行在Console模式,没有GUI界面而已,开发所需要的知识背景也基本一致,难度也没有本质差别!就系统管理而言,对象模型并没有提供比非对象模型明显的优势?!

 

五、小结

1,从管理员使用角度来看,windows系统管理中脚本语言还是有很多选择,不一定必需用PowerShell:

u       BAT并非想象的那么弱,也是能完成很多常见任务的(尤其还可以自己写一些小工具供粘合的话);

u       WSH足够强大,可以完成基本上所有系统管理任务

u       如果觉得喜欢linux/unix管理风格,还可以拿Perl/PHP作为高级Shell,有些人甚至喜欢装个Cgywin用它的Bash

 

2,对于Allinone设备厂商,windows server2008向unix/linux/bsd靠近了一大步,但由于Linux/bsd无以伦比的可裁剪性和配置灵活性,即使server 2008(sever core) 性能上和高级管理特性上与之相当,一般也不会成为最终选择。

 

3,对于独立应用软件开发商,支持PowerShell作为管理snap-in并不复杂,和支持MMC管理也是一个道理,如果以前没有这样一个应用或服务Shell,PowerShell是一个选择。

 

4,但长远而言,windows平台下PowerShell是非用不可的

windows server 2008放下身架向unix/linux世界学习,从技术角度而言方向是有利于管理员的,如同Unix/Linux管理员一样,对系统的管理可以更加深入(真正是windows操作系统的Shell)。PowerShell对Shell这个级别的用途而言还是很强大的,MS自家的服务度应用产品象IIS8/sql2008/exchange2007都提供了snap-ins来扩展PS cmdlets。作为MMC的另一种选择,windows服务端以后的管理(用户操作层)扩展统一采用PowerShell,学会使用PowerShell了,就能够摸索着那些命令的使用了,因为都是同一平台同一风格的使用。

 

六、参考

[1]      微软开发团队谈Server Core研发

[2]      Windows Server 2008 PowerShell实用解析blog.ixpub.net/html/74/15157374-279915.html

[3]      www.pin5i.com/showtopic-18554.html,开发语言排行榜里Powershell最高冲到第15位

[4]      《unix编程艺术》

[5]      《精通Windows PowerShell脚本编程》

[6]      《Windows系统管理之道--命令行脚本应用与解决方案》  http://www.china-pub.com/37784
从命令行的角度深入介绍了Windows系统管理,就日常Windows管理中最常见的任务——命令行操作、计划任务、文件系统和磁盘管理、磁盘分区管理、服务管理、注册表管理、性能监视和优化、网络管理与维护——提供了非常详细的基于命令行的解决方案。

[7]      《Windows 脚本编程核心技术精解》 http://www.china-pub.com/4022


http://blog.chinaunix.net/uid-20535506-id-1931615.html

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页