2.1 快速了解Windows PowerShell
与基于MSDOS风格的批处理文件相比,PowerShell更加容易读写,PowerShell将所有待处理的内容看成对象,管理员或者开发人员可以通过PowerShell调用.NET对象或者COM对象。进一步,PowerShell对exe执行文件也有很好的支持,可以通过传参的方式让exe执行文件按照条件执行。
同MSDOS类似,有两种方式可以执行PowerShell:第一,管理员或开发人员可以直接在Windows PowerShell控制台窗口输入执行命令并执行;第二,管理员或开发人员也可以像批处理文件一样写好脚本后根据需要单击执行,或者通过如Windows定时任务这样的定时任务工具来调用。
我们首先尝试用第一种方式熟悉PowerShell,单击屏幕左下角的“开始”按钮,单击所有程序->附件->Windows PowerShell打开Windows PowerShell控制台窗口。
(1)输入“cd\”然后回车,此命令将把当前工作目录设置为C盘根目录。
(2)输入“cls”然后回车,此命令会进行清屏。
(3)输入“1+2”然后回车,PowerShell会进行计算并将计算结果显示在屏幕上。
如果以上三个步骤都做了,PowerShell控制台画面如图2-1所示。
图2-1 PowerShell运行窗口
Windows PowerShell建立在可以重复的被称之为命令集(cmdlets)的功能集合之上,命令集的命令多遵从“动词+名词”的命名规范。例如,内置的命令Get-Process,运行将返回当前服务器上正运行的Windows进程的列表,如图2-2所示。
图2-2 获取进程信息
在Windows PowerShell的开发中,管道是一个非常重要的概念,用“|”表示,这实际上是借用了UNIX以及Linux平台下的概念,运行在UNIX平台上的CShell,以及BShell从很早的版本就开始使用“|”管道。通俗地理解管道,就是把在“|”之前运行命令执行的结果作为参数传给在“|”之后的命令作为输入参数。通常如下:
cmdlet1 | cmdlet2 | cmdlet3
比如在上例中运行的Get-Process返回了太多的结果,但实际上我们只想了解关于IIS工作进程w3wp进程的相关信息,我们可以使用Where-Object命令在Get-Process命令返回的结果集里进行过滤,如图2-3所示。
图2-3 管道
Where-Object使用“{}”里的内容作为过滤条件,“$_”代表将要被过滤的对象,“ProcessName”是该对象的某个属性,“-like”是比较条件,“w3*”通过通配符表明以“w3”开头,该过滤将返回所有进程名以“w3”开头的进程信息。
Where-Object使用标准的Windows PowerShell比较操作符,表2-1是常用的比较操作符。
表2-1 常用比较操作符
需要注意的是,通常情况下Windows PowerShell在做字符串比较时对大小写并不敏感,例如以下两个命令运行的结果是一样的:
Get-Process | Where-Object {$_.ProcessName -like "w3*"} Get-Process | Where-Object {$_.ProcessName -like "W3*"}
如果希望Windows PowerShell对大小写敏感,只需在比较符号前加入一个c,例如:
Get-Process | Where-Object {$_.ProcessName -clike "W3*"}
以上命令运行后将无结果返回,因为没有任何进程是以“W3”开头的。