具体实施方式
简言之,本发明的目标是基于反射的外壳,它提供对命令的输入参数的基于反射为处理。阅读下面的详述后将明白,本发明使第三方开发者需要写的代码的量最少,并使系统管理员为完成系统管理的任务需要知道的知识最少。从而,本发明大大减轻了系统管理员的任务。此外,本发明对输入参数提供更一致的语法,并为与输入参数有关的处理提供常用的功能。
图1示出能在本发明的示例性实施例中使用的示例性计算设备。在十分基本的配置中,计算设备100通常至少包括一个处理单元102和系统存储器104。根据确切的配置和计算设备的类型,系统存储器104能是易失的(如RAM),非易失的(如ROM,闪存等)或两者的某种组合。系统存储器104通常包含操作系统105,一个或多个程序模块106,且能包括程序数据107。操作系统105包括执行操作系统命令的命令处理器130。命令处理器130包括接收操作系统命令的外壳131(即命令处理界面)。该外壳能显示命令提示,能显示图象用户界面,或用于输入和解释用户输入的其他装置。外壳131验证,输入的命令是否有效,并发送验证的命令到命令处理器130的另外部分来执行。基本配置在图1中由虚线框108由的那些组件示出。
计算设备100能具有另外的特征或功能。例如,计算设备100也能包括另外的数据存储设备(可移动和/或不可移动),如磁盘,光盘,或磁带。在图1中那样的另外存储器由可移动存储器109和不可移动存储器110示出。计算机存储介质能包括以任何方法或技术实现的易失和非易失,可移动和不可移动介质,用于存储如计算机可读指令,数据结构,程序模块或其他数据那样的信息。系统存储器104,可移动存储器109和不可移动存储器110均是计算机存储介质的例子。计算机存储介质包括RAM,ROM,EEPROM,闪存或其他存储技术,CD-ROM,数字多功能盘(DVD)或其他光存储器,盒式磁带,磁带,磁盘存储器或其他磁存储设备,或能用于存储希望的信息并能由计算设备100访问的任何其他介质,但不限于这些。任何那样的计算机存储介质能是设备100的一部分。计算设备100也能具有如键盘,鼠标,输入笔,语音输入设备,接触输入设备等的输入设备112。还能包括如显示器,扬声器,打印机等那样的输出设备114。这些设备在业内是众知的,不必在此详细讨论。
计算设备100还能包含通讯连结116,使该设备能如通过网络与其他计算设备118能讯。通讯连结116是通讯介质的一个例子,通讯介质通常由计算机可读指令,数据结构,程序模块或以如载波或其他机制的调制数据信事情形式的其他数据实现,并包括信息提交介质。术语“调制数据信号”指的是具有以如在信号中编码信息的方式设置或改变的一个或多个特征的信号。例如,通讯介质包括如有线网络或直线连结的有线介质,和如声音,RF,红外及其他无线介质的无线介质,且不限于这些。这里使用的术语“计算机可读介质”包括存储介质和通讯介质两者。
图2是功能流图,示出在通过按本发明的基于反射的外壳的语法分析器202和引擎204的命令行250的处理。示例的命令250管线了若干命令(即处理(process)命令260,where命令262,分类(sort)命令264,和table命令266)。然而,下面讨论集中在对一个命令(如where命令262)的输入参数的基于反射的处理。对其他命令的基于反射的处理以类似方式完成。命令行250能传送输入参数到任何命令(如,“handlecount>400”被传送到where命令262)。人们注意到,处理命令260不具有任何有关的输入参数。过去,每条命令负责语法分析与该命令相关的输入参数,判断那些输入参数是否有效,且若输入参数无效发出错误消息。因为命令通常由不同的程序员写出,对于在命令行上输入参数的语法不是非常一致。此外,若发生错误,即使对同一错误而言,在各命令之间错误消息也不很一致。
例如,在Unix环境中,“ls”命令和“ps”命令之间具有许多不一致处。虽然两者均接收选项“-w”,由“ls”命令使用的“-w”选项表示页的宽度,而由“ps”命令使用的“-w”选项表示打印宽度输出(实质上不管页的宽度)。与“ls”及“ps”命令相关的求助页也具有若干不一致处,使得在一处用黑体字而在另一处不用,在一处按字母表排列而去另一处不是,在一处需要划线而在另一处不用。
如下面详细讨论,本发明提供更一致的方法,并使每个开发者必须写的复制编码的量最少。基于反射的外壳200提供一语法(如文法),对应的语义(如词典),和使开发者便于得益于由基于反射的外壳200提供的常用功能的参考模型。
在进一步描述本发明之前,提供对出现在本专利说明中的术语的定义。“命令-command”指的是独立的可执行程序。“commandlet-小命令”或“cmdlet”指的是比命令小得多的程序。在一个实施例中,每个cmdlet定义名词-动词对(如在命令行250中的get/process)。当参考按本发明写的命令时,下面讨论使用术语cmdlet。然而,在某些情况,使用更常用术语“command”谈及cmdlet。输入参数指的是对cmdlet的输入字段。变量指的是传送到命令或cmdlet的输入参数,它是argv数组中的单个字符串的等价物,或作为在Request Object中的单个元素传送。如下面将描述,Request Object指的是用于对cmdlet规定文法的机制。变量是选项,选项变量,或在命令名后的操作数中的一个。根据下述命令行给出变量的例子:
findstr/i/d:\winnt;\winnt\system32 aa*b*.ini。
在上述命令行中,“findstr”是变量0,“i”是变量1,“/d:\winnt;\winnt\system32”是变量3,而“*.ini”是变量4。“选项”是对命令或cmdlet的变量,通常用于规定对程序的默认行为的改变。继续上述的例子命令行,“/i”和“/d”是选项。“选项变量”是跟随某些选项的输入参数。在某些情况,选项变量作为选项包括在同一变量串之中。在另外情况,选项变量作为下一变量包括其中。再次参考上述命令行,“winnet;\winnet\system32”是选项变量。“操作数”是对命令或cmdlet的变量,它通常用作为向程序提供为完成程序处理所必须的信息的对象。操作数在命令行中通常跟在选项之后。再次参考上面的例子命令行,“aa*b*”和“*.ini”是操作数“可语法分析的流”包括变量。
“类成员-class members”指的是元素,如子类,字段,常数,方法,结构,特性,数组,索引,界面,事件,异常等。“控制指令-directive”指的是元数据属性。“范畴-category”指的是一组特定类型的控制指令。下面将详细解释,本发明的基于反射的外壳提供若干控制指令的范畴,如语法分析控制指令,数据生成控制指令等。在每个范畴中,基于反射的外壳提供若干控制指令。范畴和控制指令能由软件开发者扩展。
参考图2,语法分析程序202将可语法分析的流(如命令行250)分析成Request Object220-226(如where请求222)。每个Request Object220-226与一个cmdlet260-266相关联。简言之,下面结合图3详细描述,Request Object220-226对开发者提供为对cmdlet的输入参数规定文法的方法或机制。Request Object被传送到对应的cmdlet可执行码(如where可执行码232)。然而,下面将结合图4描述,语法分析程序202和引擎204在将Request Object传送到cmdlet可执行码之前,在命令行200上规定的输入参数上完成各种处理。处理包括语法分析,参数验证,数据生成,参数处理,参数编码,和参数文档化。因为语法分析程序202和引擎204在命令行的输入参数上完成常用功能,基于反射的外壳200能对用户产生一致的错误消息。人们认识到,接本发明写的可执行cmdlet230-236比以前系统中的命令需要较少的代码。每个可执行的cmdlet230-236接收对应的Request Object220-226。此外,每个可执行的cmdlet230-236输出被输入到下一管线的cmdlet的对象。通常,这些对象通过将一参考(如句柄)传送到该对象而被输入。然后,可执行cmdlet230-236能在被传送入的对象上完成附加的处理。
图3是用于对cmdlet的输入参数规定文法的数据结构300。本质上,数据结构300提供用于清楚地表达在基于反射的外壳和cmdlet之间的约定的方法。下面讨论使用由Redmend,WA的微软公司创建的,NET架构描述本发明。然而,能使用其他环境而不偏离本发明的范围。
软件开发者在对应的可执行cmdlet的码中编码数据结构300。实施此请求的方法和特性确定了,什么输入参数通过命令行向用户揭示。数据结构300是从Request Object类304导出的公共类。软件开发者为数据结构300提供类名302。类名302识别在cmdlet命令行上规定的变量的名。每个命令名302表示动词/名词对。如在图2中示出的示例命令行200中的“get/process”和“format/table”。在如“where”命令那样的命令名中,动词或名词能是隐含的。在一个实施例中人们注意到,类名不等同于cmdlet。在此实施例中,使用其他标识识别cmdlet的名。数据结构300至少包括一个公共成员(如Name300)。公共成员330,332代表与cmdlet相关的输入参数。每个公共成员330,332能具有一个或多个在每个下列范畴中的控制指令:语法分析控制指令310,数据验证控制指令312,数据生成控制指令314,处理控制令316,编码控制指令318,和文档控制指令320。这些控制指令用方括号括起来并描述跟随其后的输入参数。某些控制指令也能在类层次上应用,如用户交互类型的控制指令。数据结构300也能包括专用成员340,语法分析器不将其误码别成输入参数。专用成员340能用于存储根据一个控制指令生成的数据。
公共成员的名能用在命令行上以限定命令行上的输入参数的有效性。不然,公共成员能用于根据其在命令行的位置存储输入参数。下面是说明此概含的例子,Reqyest Object是如下:
public class FileCopy Resuest:Request Object
{
[Parsing Parameter Position Attribute(O)]
Public string From;
[Parsing Parameter Poestion Attribute(1)}
Public string To;
…
}。
Parsing Parameter Position Attribute是语法分析控制指令,它描述如何根据位置映射非限定的参数。上面提到,非限定的参数是不使用与输入参数相关的公共成员名的参数。下面是在“To”和“From成员上应用上面语法分配年控制命令之后的合适的语法:
$copy/File-From:a-To:b
$copy/File a b
$copy/File-From:a b
$copy/File a-To:b
$copy/File-To:b-From:a
下面的语法是无效的:
$copy/File-To:b a
$copy/File b-From:a
下面将描述,其他控制指令影响在命令行上规定的输入参数的处理。因此,通过使用控制指令,使cmblet的开发者能容易地规定对他们的comdlet的输入参数的文法,并完成在输入参数上的处理而不需要他们产生任何底层逻辑。
控制指令被存储在与cmdlet相关的元数据中。后面结合图4描述,元数据的处理分配在整个基于反射的外壳,元数据的处理分配在整个基于反射的外壳。例如,可应用性控制指令,文档控制指令,和语法分析导引控制指令在语法分析器的跟早阶段处理。一旦语法分析程序结束了所有输入参数的分析,在引擎中处理数据生成控制指令和验证控制指令。
下列表格示出对各种范畴的代表性控制指令,以及由基于反射的外壳响应该控制指令完成的处理的说明。
名字 |
描述 |
Prerequisite Machine RoleAttribute |
通知外壳,是否该元素只用于某些机器角色(如文件服务器电子邮件服务器)。 |
Prerequisite User Role Attribute |
通知外壳是否该元素只用于某些用户角色(如域管理员,备份操作员)。 |
表1、可应用性控制指令 |
名字 |
描述 |
Parsing Parameter PositionAttribute |
根据位置映射非限定性参数。 |
Parsing Bariable LengthParameter List Attribute |
映射不具有Parsing ParameterPesition Attribute的参数。 |
Parsing Disallow InteractionAttribute |
当参数的数目小于需的数目时规定活动。 |
Parsing Require InteractionAttribute |
规定,参数通过交互获得。 |
Parsing Hidden ElementAttribute |
使参数最终用户不可见。 |
Parsing Mandatory ParameterAttribute |
规定需要该参数。 |
Parsing Password ParameterAttribute |
需要专门处理参数。 |
Parsing Prompt String Attribute |
规定对该参数的提示。 |
Parsing Default AnswerAttribute |
规定对参数的默认回答。 |
Parsing Default Answer ScriptAttribute |
规定得到对参数的默认回答的活动。 |
Parsing Default Value Attribute |
规定对参数的默认值。 |
Parsing Default Value ScriptAttribute |
规定得到对参数的默认值的活动。 |
表2、语法分析导引控制指令 |
名字 |
描述 |
Document Name Attribute |
提供参考元素的名字用于交互或求助。 |
Document Short DescriptionAttribute |
提供元素的简单描述。 |
Document Long DescriptionAttribute |
提供元素的详细描述。 |
Document Example Attribute |
提供元素的例子。 |
Document See Also Attribute |
提供有关元素的列表。 |
Document Synopsis Attribute |
提供对元素的文档信息。 |
表3、文档控制指令 |
名字 |
描述 |
Validation Range Attribute |
规定参数必须在某范围内。 |
Validation Set Attribute |
规定参数必须在某集合内。 |
Validation Pattern Attribute |
规定参数必须符合某格式。 |
Validation Length Attribute |
规定字符串必须在长度范围内。 |
Validation Type Attribute |
规定参数必须是某类型。 |
Validation Count Attribute |
规定输入项必须是某数目。 |
Validation File Attribute |
规定对文件的某些特性。 |
Validation File AttributesAttribute |
规定文件必须在规定的范围内。 |
Validation FileSize Attribute |
规定文件必须在规定的范围内。 |
Validation Network Attribute |
规定给定的网络实体支持某些特性。 |
Validation Script Attribute |
规定在使用元素前估计的条件。 |
Validation Method Attribute |
规定在使用元素前估算的条件。 |
表4、数据验证控制指令 |
名字 |
描述 |
Processing Trim String Attribute |
规定字符串的长度限止。 |
Processing Trim CollectionAttribute |
规定集合的大小限止。 |
Encoding Type CoercionAttribute |
规定拟编码的对象的类型。 |
表5、处理和编码控制命令
在使用.NET架构的实施例中,每个范畴具有从基本范畴的类(如CmdAttribute)导出的基本类。基本范畴的类(如Cmd Attribute)导出的基本类。基本范畴类从system。Attribute类导出。每个范畴具有预定义的函数(如attrib.func()),它由语法分析程序在范畴处理间调用。cmdlet开发者能创建一客户范畴,它从客户范畴类(如cmdcustom Attribute)导出。cdmlet开发者还能通过从对现有范畴的基本范畴类导出控制指令类而扩展现有的范畴类,并用它们的实施覆盖预定的函数。cmdlet开发者还能复盖控制指令并增加控制指令到预定的控制指令组。
处理这些控制指令的次序能存储在由语法分析程序可访问的外部数据存储。基于反射的外壳导找登录的范畴并对该范畴中的每个控制指令调用一函数(如Process Custom Directive)。因此,通过存储范畴执行信息到永久存储中,范畴的处理的次序能是动态的。在不同的处理阶段,语法分析程序在和久存储中校验,以判断在那时是否有任何元数据范畴需要执行。此实施例通过从永久存储中删除范畴需要执行,此实施例通过从永久存储中删除范畴的实体很容地阻止范畴。
图4是示出用于处理一命令的输入参数的过程的逻辑流程图400。在这里,已经开发了cmdlet,且元数据已使用图3中示出的Request Object插入到cmdlet的源文件。cmdlet已被编译并已被登录。在登录期间,类名(即cmdlet名)已写入登录存储器。过程400在块401开始,在那里基于反射的外壳已接收了表示cmdlet的输入(如键入)。基于反射的外壳通过从登录处查找该输入并将键入的输入与一个登录的cmdlet相关联而将输入识别成一个cmdlet。处理进行到块402。
在块402,识别与已识别的cmdlet相关的类。此类也能通过登录处识别。处理在块404处理继续。
在块404,读出与该类相关的元数据。元数据包括任何与cmdlet相关的控制指令。控制指令能应用到cmdlet本身或在Requwst Object中规定的一个或多个参数。在cmdlet登录期间,登录程序将元数据登录到永久存储器中。元数据能以串行化格式存入XML文件或外部数据库等。如在上面表中所示,在元数据中规定的控制指令,每个与一范畴相关,如Applicability Directives,ParsingGuideline Directives等。控制指令的每个范畴在基于反射的外壳中的不同阶段处理。每个元数据控制指令处理它自己的错误管理。过程在块406处继续。
在块406,根据识别的类例示Request Object。过程在块408处继续。
在块408处,在Request Object上完成反射以获得有关输入参数的信息。基于反射的外壳提供一常用的界面,用于返回反射数据(按需要)给调用者。在上述实施例中反射使用.NET Reflaction。过程在块410处继续。
在块410处,应用可应用性(applicability)控制指令(表1)。可应用性控制指令保证在某些机器角色和/或用户角色中使用该类。例如,某些cmdlet只能由Domain Administrators使用。若在一个可应用性控制指令中规定的约束不满足,发生一错误。过程在块412处继续。
在块412处,使用元数据提供智能感觉(intellisense)。在过程的这一点,当未输入整个命令行。然而,基于反射的外壳知道,通过在与该cmdlet相关的Request Object上的反射所允话的输入参数。因此,一旦输入参数的无二意性的部分在命令行上键入,基于反射的外壳通过引擎自动完成输入参数。只要输入参数的部分能元二意性地识别一个输入参数,能发生自动完成。过程在块414处继续。
在块414处,过程一直等待到对cmdlet的输入参数被输入。通常,这是在用户如用按回车键表示命令行结束时发生。过程在块416处继续。
在块416处,应用语法分析导引控制指令,并用输入参数填入Request Object范例。语法分析程序有一组在语法分析时使用的规则,这组规则规定了在Request Object数据结构中规定的文法被转换成对在命令行上的输入参数的语法的方式。例如,给出下面对命令Foo的Request Object说明:
class Foo:Request Object
{
string Name;
Bool Recure;
}
命令行语法能是下列中任一个:
$Foo-Name:(string)-Rescure:True
$Foo-Name:<string>-Rescure True
$Foo/Name(string)
为了产生希望的语法,该组规则能由系统管理员修改。此外,语法分析程序能支持多组规则,所以用户能使用多于一个的语法。因而,在Request Object结构中规定的文法(如strin Name和Bool Recurse)驱动了语法分析器。
通常,语法分析控制指令描述,在命令行中输入的参数如何映射到在Request Object中识别的期望的参数。下面例子说明规定位置信息的语法分析控制指令。
class foo:Request Object
{
[Parsing Parameter Position Attribute(0)]
string Host Name
[Parsing Parameter Position Attribute(1)]
string Alias Name
}。
校验输入参数类型以判断是否正确。若输入参数类型不正确,输入参数能强制变成正确。若输入参数类型不正确且不能强制成正确,打印出用法错误。用法错误使用户能觉察期望的正确语法。用法错误能从DocumetationDirective 418获取描述语法的信息。一旦输入参数的类型被映射或被验证。,对应成员被填入在Request Object范例中。过程在决策块420处继续。
在决策块420作出判断,任何输入参数是否需要与用户交互。若任何参数需要与用户交互,过程进到块422。否则过程在块424处继续。
在块422,基于反射的外壳与用户交互以获取输入参数。开发者能规定,能借助对Request Object中的参数规定Cmdpg Require Interaction控制指令,通过用户的交互获得输入参数。此外,基于反射的外壳能确定,若不是命令行的所有输入参数被输入,则需要用户的交互。只要输入参数,cmdlet本身,和其他设置不拒绝交互,基于反射的外壳将与用户交互以获得必要的输入参数。能使用标志来规定,在用户层,组的层,及企业层上是否允许用户交互。若一个层不允许用户交互,发生错误消息。一旦完成用户交互,过程在块424处继续。
在块424处,引擎在Request Object范例上完成另一次通过,并应用任何余下的控制指令到输入参数。余下的控制指令包括数据生成控制指令,数据验证控制指令,对象处理控制指令,和对象编码控制指令。一旦语法分析程序结束分析输入参数,在引擎中处理这些控制指令。现将描述来自在上面表3-5中示出的每个范畴的代表的控制指令。
第一个代表的控制指令来自数据生成控制指令。Request Object能包含下列语句:
[Parsing Default Answer Scr:pt Attr:bute(F:lename,F)]
String Name;
Private Arraylist F;
由于Arraylist F是专用的,语法分析程序不将此说明处理成到该cmdlet的输入参数。替代地,Arraylist F是对由在Data Generation控制指令中规定的服务产生的数据的临时存储。在上面例子中,服务是“Filename”。Filename能是由基于反射的外壳提供的实用程序,或能是第三方函数或实用程序。当引擎遇到上述控制指令,该引擎在登录处识别名为“Filename”的服务。服务的登录在服务的安装期间发生。数据生成(Data Generation)控制指令允许在输入参数上发生单独的处理。例如,服务能在命令行上输入成“A*”的文件名上完成通配符扩展。在第二次通过之前,名字成是象它在命令行中输入的那样包含“A*”。在第二次通过期间文件名服务能定位一组以A开头的文件,并将它们存入Arraylist F。本专业行家理解,Data Generation控制指令不仅提供文件名的通配符扩展,也能能完成用户名,过程等的通配符扩展。此外,DataGreneration控制指令能完成在输入参数上的其他处理。
示例性数据验证控制指令能在Request Object中包括下列语句:
[Validation Set Attribute(“Debug,”“Production”,“Test”)]
[Parsing Parameter Mandatory Attribute]
String Name;
给出上面数据验证控制指令,语法分析程序认识到,名字是强制性输入参数,而字符串必须是Debug,Production或Test。否则,数据验证控制指令将发生错误。错误能使用文档控制指令来提供错误消息。
示例的对象处理控制指令能在Request Object中包括下列语句:
[tolower]
String Host Name;
给出上面对象处理控制指令,对Host Name规定的变量在将Request Object处理成可执行的cmd let之前转换成小写字符串。
示例性对象编码控制指令能在Request Object中包括下列语句:
[TOIP(Host IP)]
String Host Name;
Private Ipaddr HostIp;
给出上面对象编码控制指令,作为Host Name输入的字符串转换成IP地址。语法分析程序不将HostIP参数处理成输入参数,因为它被说明成Private(专用的)。然而可执行的cmdlet能参考Host IP成员。虽然上面的对象编码控制指令看来不要保存许多行代码,实际上,该控制指令大大地减少了由第三方开发者写的代码的量。例如在以前环境中,第三方开发者处理错误过程。此外,若错误消息是字符串,该字符串需要转换成多种语言。然而本发明提供一致的错误处理。而且,本发明提供一机制,用于一致地转换错误消息成多种语言。过程在块426处继续。
在块426,Request Object范例被传送到可执行的cmdlet。然后可执行cmdlet在它的处理中使用这些输入参数。因此,与以前的命令实现相反,本发明的cmdlet不必写任何单独的代码来语法分析或验证输入参数。此外,本发明提供更加丰富的环境,其中软件开发者能通过控制指令规定输入参数的另外处理。
每个控制指令处理它自己的错误消息。若需要显示错误消息,该控制指令从文档存储得到本地化的字符串,并调用显示界面来显示错误消息。有关文档控制指令的数据能存入cmdlet,XML存储或外部数据库,或源文件。因此,本发明能对所有cmdlet提供一致性为错误消息,并减少第三方的本地化工作。
此外,基于反射的外壳提供常见的界面,它返回由以对象的形式的一个控制指令产生的数据到调用的控制指令。调用的控制指令负责将数据塑造成需要的数据类型,虽然表1-5示出若干范畴的代表控制指令,能加入其他控制指令,且能加入另外的范畴而不偏离本发明的范围。
因此如上所述,本发明提供了为对cmdlet的输入参数定义方法的机制。该机制使开发者能开发,测试和支持cmdlet。该cmdlet具有较少的代码行,较快实现,具有较少缺陷,并容易寻找缺陷。在语法,语义,错误处理,资源管理,安全性等方面该机制提供更多的一致性。上述讨论在.NET架构内描述了本发明。然而本专业的行家认识到,本发明能在任何提供反射能力的操作系统中实现。此外,本发明在命令行的实施例中描述。然而,所分析的可语法分析的数据能通过语音,图象用户界面,脚本等获得而不偏离本发明的范围。而且本发明能用于通过允许一个Request Object类说明另外的Request Object类来描述丰富的方法组。因此,本发明对系统管理员提供了很大的通用性。
上述说明,例子和数据提供本发明的成分的制作及使用的完全描述。因为能作出本发明的许多实施例而不偏离本发明的精神和范围,本发明归属于附后的权利要求中。