What the heck is PowerShell?

PowerShell一开始是以Perl为root language的,这一点从PowerShell定义变量的方式就能看出来,也是以$开头。但在之后的演化中,PowerShell language越来越多的向C#靠近。这其实很容易理解,PowerShell的定位是一个基于对象的,为Windows优化的shell,基于对象必然要求要有一套object model来描述对象,那么自然.NET的object model就成为了最佳选择。选择.NET作为core type最大的好处就是PowerShell可以直接使用.NET类库而不用重复开发类似的功能处理函数,这让PowerShell站在了巨人的肩膀上。语言设计向C#靠近使得PowerShell变得更加灵活,可以胜任很复杂的逻辑实现,除此之外,已有的大量C# sample codes也是一笔财富,它们其中的大部分稍加修改就能够在PowerShell里直接运行,这对于已经熟悉C#的开发者和管理员来说,无疑是很有意义的。

.NET这些年来发展的很快,在微软内部它可以说几乎覆盖了微软所有的产品。但毕竟它还不是全部,除.NET之外,Windows world里还有好几样object models --- WMI(使用MOF -- Management Object Format),COM(Component Object Model),ADO数据库对象,ADSI(Active Directory Service Interface)。要想使用PowerShell无缝的管理所有Windows产品,支持这些对象模型也是不可或缺的。不同的对象模型对数据有着不同的表示,访问对象的方式当然也不同,但我们需要展现给用户一个统一的接口 -- 用户不需要知道这个对象到底是什么类型以及该如何访问它的属性和方法,他们需要做的就是告诉PowerShell,我要访问对象A的成员B。为了能让各种对象类型和谐共存,PowerShell使用了一个type-adaptation system来掩盖不同对象类型的差异,PowerShell脚本执行时从不直接访问一个对象,而是通过我们的type-adaptation layer(PSObject layer),这一层提供给用户简单统一的接口,隐藏了对不同对象模型访问的细节。当你运行脚本“$x.Count”时,你不需要知道$x存储的对象到底是什么类型,你关心的只是它的一个叫Count的属性。PowerShell执行这个脚本时不会生成代码直接去某个类型的对象上访问一个叫Count的属性,而是会经由PSObject layer,找出是否有一个叫Count的属性以及如何去访问它。

posted @ 2012-09-03 11:14  power.shell  阅读(155)  评论(0编辑  收藏  举报