有些读者可能是第一次看到这个单词:Cmdlet。在PowerShell 出现之前大家习惯使用CMD Shell 中的命令进行过程的操作,比如使用mkdir 命令进行文件夹的创建,使用copy 命令进行文件的复制。在PowerShell 出现以后,命令结构和模式发生了很大的变化,为了区别在传统的CMD Shell 执行的命令,我们将在PowerShell 中执行的命令称为Cmdlet。Cmdlet 的执行必须在PowerShell环境中,在CMD Shell 中执行Cmdlet的命令,会出现如图4.1所示的错误。
图4.1 Cmdlet无法在CMD Shell环境中执行
这是因为Cmdlet 相比传统的CMD 命令,它是基于.Net 框架进行重构的命令。这就意味着执行PowerShell Cmdlet,必须有.Net 环境支持,脱离.Net执行环境支持,执行PowerShell Cmdlet会直接报错。
那传统的CMD命令和Cmdlet除执行环境不同之外,还有什么差别呢?接下来我们通过对比CMD命令和Cmdlet,来让大家了解下其他的具体差别。
· Cmdlet是.Net类的实例化,不是单独执行的命令。
· Cmdlet是经过.Net 类实例化编译后的可执行程序。
· Cmdlet本身不负责错误处理、数据输出等操作,这些操作交由PowerShell 本身的运行环境处理。
· Cmdlet通过管道进行对象的处理,而不是文本数据流,同时可以将Cmdlet执行的结果作为对象传递到管道。
· Cmdlet是面向记录的操作,因为Cmdlet 一次只能面对一个对象实现处理。
在PowerShell 环境中除了可以执行一些PowerShell的Cmdlet之外,还可以部分执行如下的命令或脚本。如果一个命令既是PowerShell Cmdlet别名,也是CMD Shell中的命令,命令执行之后优先执行为PowerShell Cmdlet命令。
· Cmdlet命令:PowerShell中的所有Cmdlet都支持直接执行。
· CMD命令:支持传统的CMD Shell里面除了别名之外的所有命令功能。
· 别名命令:基于PowerShell构建的Cmdlet的别名。
· Bat脚本:支持CMD Shell 可用的脚本。
· VBS脚本:支持VBS脚本的命令执行。
· Function :支持PowerShell Function 功能函数。
这里以Set为例,Set在CMD Shell中是获取系统中的参数变量,但是我们在PowerShell中的功能是设置变量。在执行相同命令时结果是完全不同的,图4.2所示为CMD 环境中执行的Set和PowerShell环境中执行的Set命令的对比。
图4.2 CMD环境和PowerShell环境中的Set命令对比
Cmdlet命令相比传统的CMD 命令,更加人性化和语言自然化。如果PowerShell不采用别名的情况下,它的所有Cmdlet都满足“动词+名词”格式。“动词+名词”这样的结构让管理员理解命令变得更加简单,当前PowerShell环境中支持哪些PowerShell命令呢?我们可以通过如图4.3所示的Get-Command命令来查看当前PowerShell支持哪些命令。
图4.3 PowerShell中的Cmdlet格式
相信大家能够发现,命令都是非常固定的格式。动词可以定义为行为,而行为一定要有目标,目标这里就是定义的名词。“动词+名词”结构构成了PowerShell的Cmdlet的组成方式,而且这种定义与人的自然语言很相似。这种结构让使用者通过前面的动词就能猜测出行为,大家能猜出下面使用非常频繁的单词代表的意思吗?
· New:新建对象使用的动词。
· Remove:删除对象使用的动词。
· Set:设置对象使用的动词。
· Get:获取对象使用的动词。
· Update:更新对象使用的动词。