在Windows Server 2008之前,Windows网络的所有配置和管理等操作都在视窗模式下进行,界面友好、上手容易。但Windows Server 2008中,为我们集成了一个种新的命令解释程序Windows PowerShell,其以简洁、高效为我们提供了另一种Windows系统和网络的管理方式,成为系统管理、日常事务处理的一个不可或缺的工具。

11.1 PowerShell概述

Windows PowerShell(简称为PowerShel)是微软公司于2006年第四季度正式发布,是在.NET 公共语言运行时(CLR) 和.NET Framework 的基础上构建的一种命令外壳程序,是一种交互式的命令行和基于任务脚本编写技术,可以使管理员能够更加有效的自动操作和控制系统管理任务。

传统的基于DOS的命令行解释器和Windows命令解释器以文本方式进行操作,字符串是唯一能够操作的对象。但PowerShell是基于.net平台并面向对象的shell,并能够同时支持WMI、COM、ADO.NET、ADSI等已有的Windows管理模型,所以不仅在本质上有了不同,而且在功能上有了很大的改进和提高,对于一些重复的操作、复杂的管理,同GUI的管理方式相比,PowerShell更具优势。

在Windows Server 2008 R2中,PowerShell功能有了更大的增强,主要如下:

  1. 新cmdlet。Windows PowerShell 中的简单命令工具(简称为 cmdlet)是Powershell中的一个最小单位,类似于Windows Command Shell下一个一个的命令,可用于解决在GUI环境下比较复杂的管理任务。在Windows Server 2008 R2中新增了 100 多个新的cmdlet,如Get-Hotfix、Get-ComputerRestorePoint、Debug-Process、Add-Computer、以及Reset-ComputerMachinePassword等。
  2. 远程管理。仅需采用单个命令就可以远程管理并在一台或数百台计算机上执行指令。
  3. Windows PowerShell 集成脚本环境 (ISE)。Windows PowerShell ISE为用户提供 PowerShell 的图形用户界面,它提供了八个独立执行环境,并内置了调试程序、多行编辑、选择性执行、语法颜色、行和列编号,以及上下文相关帮助等功能。
  4. 后台作业。利用后台作业,可以在本地或远程计算机的“后台”异步运行多个命令,而不影响前台任务的执行。
  5. 调试程序。同其它开发软件一样,PowerShell 的调试程序可以帮助调试函数和脚本。
  6. 模块。PowerShell 模块允许将Windows PowerShell 脚本和函数组织到独立单元中,由于模块分别在独立的会话中运行,所以可以避免名称冲突的发生。
  7. 事务。Windows PowerShell 在Windows Server 2008 R2中提供了对事务的支持,使按逻辑单元管理一组命令得以实现。
  8. 事件。Windows PowerShell 在Windows Server 2008 R2中提供了新的事件基础结构,支持了更多的事件类型和应用。
  9. 高级函数。在Windows Server 2008 R2中,使用 Windows PowerShell 脚本语言可以作高级函数的编写。
  10. 脚本国际化。在Windows Server 2008 R2中,脚本和函数支持多语言。
  11. 联机帮助。在Windows Server 2008 R2中,Get-Help cmdlet具有一个新的 Online 参数,通过使用该参数可以打开 Microsoft TechNet 上最新、最完整的帮助信息。
11.2 PowerShell安装和启用

PowerShell能够运行在Windows XP SP2、Windows Vista、Windows 2003操作系统上,如果当前的操作系统版本为Windows Server 2008,则PowerShell 1.0 已内置,只需要功能模块中添加即可启用。本节将介绍在Windows Server 2008中如何安装和启用Windows Powershell。

11.2.1 添加PowerShell

在Windows Server 2008中,可以直接通过服务器管理器添加PowerShell 1.0。

1. 依次单击【开始】→【管理工具】→【服务器管理器】。在【服务器管理器】容口中单击【功能】,然后在右边的详细窗格中单击【添加功能】选项。

2. 在【选择功能】窗口的功能列表中选择“Windows PowerShell”,然后单击【下一步】按钮进行安装。如图11.1所示。

11-1

图11.1 添加PowerShell功能

3. 安装完毕后依次单击【开始】→【所有程序】,在出现菜单中单击“Windows PowerShell 1.0”,然后单击子菜单中有“Windows PowerShell”即可打开PowerShell命令解释程序进行操作了。如图11.2所示。

11-2b

图11.2 使用PowerShell

11.2.2 安装图形化PowerShell

PowerShell 是一种强大的的命令行外壳和脚本语言,但对于初学者在面对复杂的命令语句时可能会望而却步。为了帮助初学者更快的入门,减少对命令语句记忆负担,我们可在在网上下载一款非常适用且免费的软件PowerGUI。该软件由管理控制台和脚本编辑器两大部分组成,提供了PowerShell图形化界面操作环境。

如图11.3所示,PowerGUI具有丰富、直观用户界面的PowerShell控制台,并且在输入cmdlet命令还带有智能提示功能,这样为不是很熟悉命令语句的初学者帮助非常大。

11-3

图11.3 PowerGUI管理控制台

如图如图11.4所示,PowerGUI中自带的脚本编辑器是一个带丰富调试功能的集成开发环境,它还具有语法高亮、智能感知、代码段以及即时帮助等功能,为我们进行脚本编写和调试提供了方便。

11-4

图11.4 PowerGUI脚本编辑器

11.3 PowerShell入门体验

在前面我们了解了PowerShell的概念和功能,并进行PowerShell的安装,在本节我们进行Windows PowerShell的入门体验,让读者能够对PowerShell有一个初步的认识。

11.3.1 Cmdlets基础

Cmdlets(读作“command-let”)是Windows PowerShell的中最小单元,即PowerShell中的一个一个用于操作对象的单功能的命令,这些命令我们可以单个使用,以可组合起来应用。在Windows PowerShell 1.0中内置了约129个这样的cmdlet命令。

Cmdlet是由短划线分隔开的动词和名词,如Get-Service、Get-Process等。动词表示要作了操作,如get表示要获取某些信息;名词表示要处理的对象,而这个对象具有相应和属性和方法。Cmdlet后也常常跟上参数和参数值。

对于初学者,首先要弄清楚get-command和get-help的用法。一般情况下是先通过get-command找到相应的命令,然后再通过get-help查找这个命令的用法。

比如我们需要找到有关进程的命令,可以输入以下命令:

PS C:\> get-command *process*

输出结果如下:

PS C:\> get-command *process*

CommandType Name Definition

----------- ---- ----------

Cmdlet Get-Process Get-Process [[-Name] <String[]

Application qprocess.exe C:\Windows\system32\qprocess.e

Cmdlet Stop-Process Stop-Process [-Id] &lt;Int32[]> [

在输出结果中我们找到了显示进程命令Get-Process,我们需要知道其用法则需要用get-help命令来查找相关的帮助信息。

为了显示有关 get-process cmdlet 的帮助信息,我们输入以下命令:

PS C:\&gt; get-help get-process

输出结果下:

PS C:\&gt; get-help get-process

名称

Get-Process

摘要

获取在本地计算机上运行的进程。

语法

Get-Process [[-name] <string[]>] [<CommonParameters>]

Get-Process -id <Int32[]> [<CommonParameters>]

Get-Process -inputObject <Process[]> [<CommonParameters>]

详细说明

Get-Process cmdlet 检索每个进程的进程对象。在没有参数的情况下,“Get-Process”将获取计算机上的您键入“Get-Process *”的情况相同。还可以通过进程名称或进程 ID (PID) 来标识特定进程,或通过管道-Process。对于 Get-Process,默认方法为通过进程名称。对于 Stop-Process,默认方法为通过进程 ID。

相关链接

Stop-Process

备注

有关详细信息,请键入: "get-help Get-Process -detailed".

有关技术信息,请键入: "get-help Get-Process -full".

通过以上操作,我们知道要获取get-process的详细使用信息需要的命令是“get-help Get-Process -detailed”。

11.3.2 理解对象

由于Windows PowerShell是面向对象的脚本编写技术,我们有必要对对象作一个了解。要了解对象,我们需要了解以下几个概念:

类(Class)

类是对客观事物的特性的抽象,这些特性包括物体(或称对象)的特征和行为。共同的特性我们可以称为基类,差异性特征则为派生的子类,子类有自己特有的属性和行为,但也会会继承父类的属性和行为。在Windows PowerShell中,类表明了一个cmdlets所收集的对象的种类,对于一个类可以用相关的属性和方法将它表示出来。

对象(Object)

对象可以认为是类的特定实例,是一系列信息的结构化体现,如文件就是是一个文件系统类的一个特定对象。每当运行cmdlets时,将会有一个或多个对象被返回,而这个对象代表一个真正的实体。

属性(Property)

对象由一系列属性进行描述,如一个文件包括了文件名、大小、创建日期、所有者等属性。

方法(Method)

对对象或其属性的操作。如对一个文件进行拷贝,或对这个文件的权限进行修改等。在Windows PowerShell中,相应的方法已经定义好了,只需调用即可使用。

那么我们如何知道一个对象有哪些方法可用,并如何调用呢?Windows PowerShell为我们提供了一个非常有用的cmdlet命令get-member,通过它可以显示某个命令返回的.net对象信息,而且该信息包含了我们所需对象的类型、属性和方法。

比如我们现在要对C:\test.txt这个文件进行处理,需要查询一个可以对之进行操作的方法,我们可以进行如下操作:

首先我们为这个文件定义一个变量,操作如下:

PS C:\&gt; $var1=Get-ChildItem "c:\test.txt"

然后利用get-member来获取对这个变量的可用属性,操作如下:

PS C:\&gt; Get-Member -InputObject $var1 -MemberType property

输出结果下:

PS C:\&gt; $var1=Get-ChildItem "c:\test.txt"

PS C:\&gt; Get-Member -InputObject $var1 -MemberType property

TypeName: System.IO.FileInfo

Name MemberType Definition

---- ---------- ----------

Attributes Property System.IO.FileAttributes Attributes {get;set;}

CreationTime Property System.DateTime CreationTime {get;set;}

CreationTimeUtc Property System.DateTime CreationTimeUtc {get;set;}

Directory Property System.IO.DirectoryInfo Directory {get;}

DirectoryName Property System.String DirectoryName {get;}

Exists Property System.Boolean Exists {get;}

Extension Property System.String Extension {get;}

FullName Property System.String FullName {get;}

IsReadOnly Property System.Boolean IsReadOnly {get;set;}

LastAccessTime Property System.DateTime LastAccessTime {get;set;}

LastAccessTimeUtc Property System.DateTime LastAccessTimeUtc {get;set;}

LastWriteTime Property System.DateTime LastWriteTime {get;set;}

LastWriteTimeUtc Property System.DateTime LastWriteTimeUtc {get;set;}

Length Property System.Int64 Length {get;}

Name Property System.String Name {get;}

在以上输入结果中我们选择文件名Name这个属性,然后再查看对这个属性可用的方法。

首先我们对Name这个属性定义一个变量,操作如下:

PS C:\&gt; $var2=(Get-ChildItem "c:\test.txt").name

然后查询针对这个变量的可用方法,操作如下:

PS C:\&gt; Get-Member -InputObject $var2 -MemberType method

输出结果下:

PS C:\&gt; $var2=(Get-ChildItem "c:\test.txt").name

PS C:\&gt; Get-Member -InputObject $var2 -MemberType method

TypeName: System.String

Name MemberType Definition

---- ---------- ----------

Clone Method System.Object Clone()

CompareTo Method System.Int32 CompareTo(Object value),……

Contains Method System.Boolean Contains(String value)

CopyTo Method System.Void CopyTo(Int32 sourceIndex, ……

EndsWith Method System.Boolean EndsWith(String value),……

Equals Method System.Boolean Equals(Object obj), System……

GetEnumerator Method System.CharEnumerator GetEnumerator()

GetHashCode Method System.Int32 GetHashCode()

GetType Method System.Type GetType()

GetTypeCode Method System.TypeCode GetTypeCode()

get_Chars Method System.Char get_Chars(Int32 index)

get_Length Method System.Int32 get_Length()

IndexOf Method System.Int32 IndexOf(Char value), System.……

IndexOfAny Method System.Int32 IndexOfAny(Char[] ……

Insert Method System.String Insert(Int32 startIndex, ……

IsNormalized Method System.Boolean IsNormalized(),……

LastIndexOf Method System.Int32 LastIndexOf(Char value……

LastIndexOfAny Method System.Int32 LastIndexOfAny(Char[] anyOf),……

Normalize Method System.String Normalize(), System.String……

PadLeft Method System.String PadLeft(Int32 totalWidth),……

PadRight Method System.String PadRight(Int32 totalWidth),……

Remove Method System.String Remove(Int32 startIndex, Int32……

Replace Method System.String Replace(Char oldChar, Char……

Split Method System.String[] Split(Params Char[]……

StartsWith Method System.Boolean StartsWith(String value),……

Substring Method System.String Substring(Int32 startIndex)……

ToCharArray Method System.Char[] ToCharArray(), System.Char[]……

ToLower Method System.String ToLower(), System.String……

ToLowerInvariant Method System.String ToLowerInvariant()

ToString Method System.String ToString(), System.String……

ToUpper Method System.String ToUpper(), System.String……

ToUpperInvariant Method System.String ToUpperInvariant()

Trim Method System.String Trim(Params Char[] trimChars),……

TrimEnd Method System.String TrimEnd(Params Char[] trimChars)

TrimStart Method System.String TrimStart(Params Char[] trimChars)

在上以列表中我们找到针对文件名这个属性的方法后就可以直接调用方法。如我们将文件名显示为在大写,则可进行如下操作:

PS C:\&gt; $var2.ToUpper()

输出结果下:

PS C:\&gt; $var2.ToString()

test.txt

PS C:\&gt; $var2.ToUpper()

TEST.TXT

11.3.3 理解管道

熟悉windows cmd和Linux的用户应对管道的运用并不陌生,而在Windows PowerShell中同样支持管道功能。

所谓管道即将一个命令的输出作为另一个命令的输入,在命令中以竖线“|”表示。在Windows PowerShell中,利用管道可以实现筛选、排序、分组、统计、选择以及格式化等功能。在本小节中,我们将以几个实例让大家有所体验。

实例一:筛选

只显示服务列表中dns和dhcp信息,命令操作和输出结果如下:

PS C:\&gt; get-service | where-object { $_.name -like "dns" -or $_.name -like "dhcp" }

Status Name DisplayName

------ ---- -----------

Running Dhcp DHCP Client

Running DNS DNS Server

实例二:排序

对当前的进程按对CPU的利用率进行排序,命令操作和结果如下:

PS C:\&gt; get-process | sort-object -property CPU

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName

------- ------ ----- ----- ----- ------ -- -----------

512 0 0 1296 4 4 System

0 0 0 24 0 0 Idle

73 2 824 2040 23 0.08 1756 svchost

43 2 884 2416 48 0.09 3800 TscHelp

42 2 536 1588 15 0.13 1860 svchost

51 2 896 2620 39 0.13 1036 SnagPriv

111 4 3876 5412 46 0.14 3296 TrustedInstaller

160 4 1744 3280 31 0.19 616 lsm

100 4 1772 2748 47 0.28 320 dfssvc

136 5 1848 4204 56 0.31 2052 taskeng

227 7 3188 4600 44 0.33 2536 svchost

125 5 1788 3412 37 0.38 1732 svchost

71 3 1136 2840 39 0.38 3324 dwm

154 5 2024 4876 51 0.55 1520 taskeng

154 4 2996 5192 36 0.61 964 svchost

28 1 252 532 4 0.70 400 smss

99 4 1156 3200 42 0.97 520 wininit

141 5 3592 5808 47 1.16 1484 dfsrs

119 3 1300 3308 26 1.27 772 winlogon

147 6 7208 880 46 1.33 1572 ntfrs

162 8 2792 5356 60 1.36 776 msdtc

53 3 1208 2888 51 1.48 2772 VMwareTray

276 7 2940 5348 35 1.50 844 svchost

267 22 5580 6768 47 1.86 1292 svchost

235 8 7012 6316 67 2.03 1104 svchost

420 5 1920 4292 109 3.58 468 csrss

5174 6278 36804 24496 94 4.77 1504 dns

287 9 5368 7104 83 4.80 1432 spoolsv

300 5 2044 4632 38 5.17 780 svchost

499 13 4584 5908 44 5.59 1048 svchost

509 11 39456 42140 164 6.42 3644 powershell

409 13 15000 12144 79 6.13 1128 svchost

631 10 3480 6536 45 6.20 608 lsass

98 3 5620 7884 40 6.28 1004 SLsvc

249 7 2120 4632 37 6.83 596 services

230 8 5812 8788 65 8.56 588 dllhost

1237 38 25780 27368 160 14.78 984 svchost

298 10 6668 7060 47 25.59 924 svchost

338 15 18236 27948 151 28.47 3792 SnagIt32

576 21 74644 61908 289 29.80 504 mmc

132 4 4464 7360 63 34.44 3096 VMwareUser

583 16 25596 30464 172 41.05 2716 explorer

295 7 5180 9532 170 48.33 2684 csrss

203 5 3180 6328 73 61.50 1808 VMwareService

实例三:分类

对当前目录下的文件按扩展名进行分类,命令操作和输出结果如下:

PS C:\&gt; Get-ChildItem | Group-Object -property extension

Count Name Group

----- ---- -----

8 {image, PerfLogs, Program Files, PS...}

1 .bat {autoexec.bat}

1 .BAK {BOOTSECT.BAK}

1 .sys {config.sys}

1 .exe {NewSID-重新生成新的安全标识符.exe}

2 .txt {rodc.txt, test.txt}

1 .dat {SPCSqmDataReview.dat}

实例四:统计

统计当前进程数,命令操作和结果如下:

输出结果下:

PS C:\&gt; Get-Process | Measure-Object

Count : 44

Average :

Sum :

Maximum :

Minimum :

Property :

实例五:选择

只显示当前进程powershell中指定字段内容,命令操作和输出结果如下:

PS C:\&gt; get-process -name powershell

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName

------- ------ ----- ----- ----- ------ -- -----------

846 10 38592 41456 164 9.38 3644 powershell

PS C:\&gt; get-process -name powershell | Select-Object -property handles,id,processname

Handles Id ProcessName

------- -- -----------

892 3644 powershell

根据上面的输出结果,我们可以看到第一个命令为全部字段进行了显示,而第二个命令则只显示handles,id,processname三个字段的内容。

实例五:格式

对显示的内容进行格式化,我们这里采用autosize来使显示时基于实际数据来计算列宽。命令操作和输出结果如下:

PS C:\&gt; get-process -name powershell | Select-Object -property handles,id,processname |format-table -autosize

Handles Id ProcessName

------- -- -----------

521 3644 powershell

11.3.4 PowerShell常用命令体验

待续

11.3.5 PowerShell脚本编写

待续