PowerShell基础知识之一本Blog所发表的所有原创文章,未经许可,禁止以任何形式进行转载.作者:Edengundam(马涛)如果要学一门语言,你就必须对语言的语法,特性有所了解.只要对语言的各个环境了解,才能更好编写,调式,部署你的程序.因此,教程第二部分将会着重于如下几个方面:1.PowerShell,Shell,脚本语言等概念;2.参数绑定;3.类型转换.这些基础知识,希望大家不要轻视,因为后面的教程将会直接引用这些概念.首先,我们先来调查PowerShell中最重要的元素:命令(Command).在PowerShell中,命令分为四类:cmdlet,function,script和nativeWindowscommands.可能看到这四个英文名称会有些头大,我们来仔细了解一下.1.cmdlet在PowerShell官方blog上,有篇关于Cmdlets和API的介绍.因为PowerShell建立在.Net上,再加上COM,WMI,ADO,XML等技术.使得PowerShell对于.Net应用开发人员,服务器管理人员来说都会非常方便,通过这些已有的接口,即可完成大量的任务.但是,PowerShell的设计者明确的指出Cmdlets是PowerShell的灵魂.Cmdlet是Command-Let的缩写.cmdlet这类命令有一种统一的命名方法:Verb-Noun,也就是动词-名词.如果你是一名.Net程序员,那么编程规范中应该也会提出,对于方法(method)的命名,最好使用动词-名词形式配合骆驼(Camel)命名法.查看有哪些cmdlet参考如下:PSC:\get-command-CommandTypecmdletCommandTypeNameDefinition-------------------------CmdletAdd-ContentAdd-Content[-Path]String[][-Value]Object[...CmdletAdd-HistoryAdd-History[[-InputObject]PSObject[]][-Pass...CmdletAdd-MemberAdd-Member[-MemberType]PSMemberTypes[-Name]...CmdletAdd-PSSnapinAdd-PSSnapin[-Name]String[][-PassThru][-Ve...CmdletClear-ContentClear-Content[-Path]String[][-FilterStrin...CmdletClear-ItemClear-Item[-Path]String[][-Force][-Filter...CmdletClear-ItemPropertyClear-ItemProperty[-Path]String[][-Name]S...这里我省略了绝大部分的显示(^^),PowerShellVersion1.0微软官方发布的版本包含了PSC:\(get-command-CommandTypecmdlet).count129129确实有点多,但是实际上在学习过程中你会发现学习他们的过程比你学习unixshell中命令更加容易些,原因稍后为你解答.cmdlet是可以进行扩展的,如果你想开发自己的cmdlet,你需要下载PowerShellSDK.目前,我只知道该SDK包含在了WindowsVistaPlatformSDK中.下载该SDK,需要进行正版验证.在伴随着教程的编写过程,我也会阅读PowerShellSDK中关于PowerShell的介绍,并尽量用最简单的语言将需要注意的内容,传达给大家.cmdlet的开发并不复杂,可以使用C#作为实现语言,PowerShellSDK已经实现了好了cmdlet的一个基类,开发的cmdlet只需要继承该基类.通过这种开发模式,最大的优点:(1).所有的cmdlet中包含了一些公共参数(commonparameters),例如:-Verbose,-Debug,-ErrorAction,-ErrorVariable,and-OutVariable.这些参数大多用于一些脚本调试等.(2).所有的cmdlet中的参数(parameters)具有相似的参数,相同的类型,甚至具有相同的性质.对于接受输入的某些cmdlet来说,输入的参数就叫做-InputObject,参数类型一般是[object[]],而通常都会具有从管道线读取处理对象的属性.这种一致性带来的最大好处就是,对于一个命令,往往你只需要关注命令的特性,不需要记住复杂繁多的参数.如果你熟悉unixshell下的utilscoretools那么我相信,例如awk使用-F指定一个支持正则表达式的与分隔符,cut使用-d来分割,sort使用-t进行分割对你来说是痛苦的.在PowerShell中,你甚至不需要对cmdlet产生的输出进行分割.这点你会在稍后看到.cmdlet编译后的结果不是可执行文件,而是dll文件,PowerShell启动时,将这些命令加载,这些命令执行效率最高,因为他们在PowerShell时被载入PowerShell进程内.2.函数(function)函数,准确的说就是:有名称的代码块(scriptblock).下面就是一个简单的函数定义:PSC:\functionGet-DayToBeiJingOlympic{([datetime]2008-08-08-[datetime]::Now).Days;}PSC:\Get-DayToBeiJingOlympic370细节大家可以不用关心,稍后都会讲到.函数就是一段你输入到PowerShell的命令集合.但是函数在被定义后,才存在于PowerShell内存中,当PowerShell退出时,就会消失.效率上,函数在第一次调用时需要编译,因此第一次调用速度较慢.3.脚本(script)PowerShell在交互式Shell(interactiveShell)和脚本语言(scriptLanguage)之间进行了平衡,提供了执行脚本的能力.脚本类似于函数,存放在文件中,调用时由PowerShell载入内存,编译并执行.效率上来讲,脚本慢于函数(function),主要原因在于函数只会在第一次调用时被编译,而脚本每次调用都会被编译一次.但是编译后的执行阶段,他们的性能是近似相等的.4.nativeWindowscommand我不知道应该这个东西用什么名字.这类命令在Windows世界大量存在,譬如:dir,findstr,del,ping.这些命令就是Windows之前的可执行文件(非.Net命令行可执行文件).在PowerShell中调用这些命令效率是最低的,因为执行他们PowerShell需要创建一个新进程.此外因为这些命令早于PowerShell,因此他们的信息输出都是基于文本的(也可以说是字符串),因此丧失了PowerShell对对象的处理能力.因此,如果你知道PowerShell的实现,就避免使用这些命令.讨论完命令,我简单介绍下别名(alias):PSC:\(Get-Command-CommandTypealias).count101你一定在想,PowerShell为什么提供了这么多别名,难道要累死我们??PowerShell为了方便使用windows和unix,linux的人们,支持了两套别名,譬如dir相对于ls,还有unix,linux的grep等.这样无论你使用windows还是linux都能相对来说快速的上手PowerShell.PowerShellVersion1.0中有一个缺陷,既定义别名时,不允许指定参数.这无疑是PowerShell的一个缺陷.但是因为cmdlet中参数较少(一般都是10个以内),因此大多数时候,你不需要定义带有参数的别名,如果真的需要,可以用函数来替代.这种缺陷,与代码块的执行等功能有冲突.希望在后续版本能有别名功能能够更加强大.WindowsPowerShell是微软公司为Windows环境所开发的壳程式(shell)及脚本语言技术,採用的是命令行界面。这项全新的技术提供了丰富的控制与自动化的系统管理能力。之前的专桉代号是Monad,程式另一个名称叫MicrosoftShell(MSHWindows系统下的PowerShell即开发代号为Monad的命令行外壳和脚本系统管理工具回答者:Michael-大魔法师六级2008-7-610:23即开发代号为Monad的命令行外壳和脚本系统管理工具。PowerShell是微软公司于2006年第四季度正式发布的.它的出现标志着,微软公司向服务器领域迈出了重要的一步,拉近了与Unix,Linux等操作系统的距离.PowerShell的前身命名为Monad,在2006年4月25日正式发布beta版时更名为PowerShell.PowerShell是一款基于对象的shell,建立在.Net框架之上,目前支持.NetFramework2.0.能够运行在WindowsXPSP2,WindowsVista,Windows2003操作系统上.能够同时支持WMI,COM,ADO.NET,ADSI等已有的Windows管理模型.根据微软公司的计划,2009年将会实现所有微软公司的GUI管理工具通过PowerShell作为中间层对服务程序进行管理,现阶段例如Exchange2007等已经支持PowerShell的管理.可以预期,使用PowerShell管理Windows服务器指日可待.目前PowerShellVersion2.0正在紧锣密鼓的开发中,最近首席架构师接受了媒体采访,介绍了关于远程管理等新特性.