PowerShell与Framework集成实现参数自动传递 |
发布时间: 2012/7/12 10:16:26 |
在实际工作中,系统管理员可能会遇到这种情况:前面一个命令的结果,刚好是后面一个命令的参数。这种需求在Linux等操作系统中可以轻松的实现,但是在传统的Windows环境中,实现起来却有一定的困难。不过在Win2008中,可以将PowerShell与Framework集成,来实现这种需求。
一、传统解决方案的弊病。 由于Windows的Shell是运行在基于文本的环境当中。为此为了自动化目标就必须要对输出进行格式化操作。如现在需要将某个命令的结果传递到下一个命令作为参数,就必须要对前面一个命令的结果的输出进行格式化操作,以满足于第二个命令的要求。也就是说,无法直接将第一个命令的结果传递到后面一个命令中去。 这种格式化的操作,从理论上说是可行的。但是,通常情况下将文本数据转换为可用的格式中间需要大量的动作。有时候即使文本内容一个字没变,而只是格式不同,进行格式化操作仍然需要耗费大量的资源。所以在以前的应用环境中,绝大部分系统工程师对于这个需求是望而生畏。不过在Win2008中,可以将Powershell与Frame结合,解决了这个难题。 PowerShell可以将数据不作为纯文本形式进行传送,而是以FrameWork对象的形式来检索数据。如此的话,在不需要对结果进行格式化的情况下,后面一个命令就可以直接使用前面一个命令的结果来作为参数。为此系统不需要再修改文本数据,而只需要通过名称来引用所需要的数据即可。在这个过程中,系统管理员并不需要编写代码来将数据转换为有用的格式,而只需要引用对象并按需要来操作对象即可。 二、反射机制实现命令之间的自动询问过程。 反射是Framework中的一个机制。通过这个机制,可以让系统检查对象并检索他们支持的方法、属性、字段等等。由于PowerShell是建立在这个机制之上的,为此系统工程师可以通过发射机制来实现参数的自动传递。简单的说,就是通过Get-member Cmdlet来实现类似的功能。此时这个Cmdlet会帮助系统工程师分析通过管道传递的对象或者对象集合。笔者这里举一个简单的例子。如可以通过下面的命令分析某个命令返回的对象并显示相关的属性和方法。 Get-process | get-member. 其实用过Linux操作系统的用户,对于这个命令是非常熟悉的。在Linux中,就是通过“|”符号将前后两个命令联系起来的。不过这里需要注意的是,虽然在Windows操作系统中也可以通过这个符号实现类似的功能,不过其背后的实现机制是不同的。在Windows中,在这里是借助了Framework框架下的发射机制。有时候我们也将这个过程叫做询问对象机制。在实际工作中,会非常的有用。 三、ETS扩展类型系统实现数据类型的自动匹配。 众所周知,无论是函数还是过程,都要强调数据类型的相互匹配。在参数自动传递的过程之中,如果数据类型不匹配,仍然无法满足自动传递的需求。为了解决这个数据类型匹配的问题,系统中引入了ETS机制。 在说这个机制之前,笔者先给大家消除一个误区。笔者以前在跟一些系统工程师交流的时候,他们认为PowerShell中的脚本是无类型的。其实这大错特错。虽然在实际工作中,很少需要指定变量的数据类型,但是这并不是说其没有数据类型。这就好像一个人不说话,并不能够代表其就是哑巴。从本质上说,PowerShell是数据类型驱动的。也就是说需要受到数据类型匹配的约束。只不过系统采用了ETS扩展类型系统机制,在工作时会对不同的数据类型自动进行转换。真是因为这个机制,系统工程师不需要考虑对象的类型。因为PowerShell能够适合不同的数据类型并向管理员显示其对某个对象的理解。在了解这个机制时,笔者认为需要抓住如下几个要点。 本文出自:亿恩科技【www.enkj.com】 |