Windows PowerShell 2.0应用编程最佳实践

【书名】Windows PowerShell 2.0应用编程最佳实践
【作者】高阳,付海军 编著
【ISBN】978-7-121-10165-6
【出版社】电子工业出版社
【出版日期】2010年2月
【宣传语】
【本书特色】
【内容简介】
Windows PowerShell是微软为Windows系统开发的Shell及脚本语言技术,它是一种新的命令行外壳和脚本语言,用于实现系统自动化管理。它的出现弥补了与Linux/Unix系统相比Windows在Shell方面的不足,同时也为程序开发人员提供了一种更高效的编写脚本的工具。Windows PowerShell建立在.NET Framework 2.0/3.x的基础上,IT专业人员可通过命令或脚本来管理计算机,从而管理与维护系统,并通过系统自动化来提高工作效率。在Windows 7和Windows Server 2008 R2中已经整合了PowerShell 2.0,并且支持图形界面操作。
本书的作者由微软MVP专家组成,从程序开发人员和系统管理员的角度全面介绍了Windows PowerShell的编程技术。书中不仅讲解了其核心模块和基本概念,还提供了大量利用Windows PowerShell的强大功能构建的大量开发实例,从而让读者深入此语言的精髓。本书特色为内容由浅入深,分为语法、基础应用和高级应用3个部分,是学习Windows PowerShell编程的最佳参考书。
本书适合.NET开发爱好者,初、中级开发人员和系统管理员,特别有助于系统管理员提高系统自动化管理的效率。本书也可作为相关培训机构的参考教材,以及高等院校相关专业师生的参考书。
【前言】
Windows PowerShell(下简称为“PowerShell”)是一种命令行界面和脚本语言,专为Windows系统管理设计。它是一种优雅的新型动态语言,构建在Microsoft .NET Framework之上,可以用来编写全方位的Windows Script。以往需要VB、VBScript或C#才能实现的功能现在只需要PowerShell即可轻松完成,它可帮助IT专业人士控制和自动管理Windows操作系统及其应用程序。
Windows系统的缺憾之一在于未提供诸如Linux/Unix Shell那样的强大脚本支持,而使得系统管理员的工作效率不高。PowerShell通过对象适配机制使得这些对象具有.NET对象那样的外观和工作方式,它允许使用多种应用程序的自动适配对象,如活动目录(AD)、WMI、COM、ADO.NET对象和XML属性等。如今微软Windows 7和Windows Server 2008 R2已经完美包含了PowerShell 2.0,这种技术也已经逐渐被系统管理员所接受,但是很多.NET开发人员却了解甚少。作为IT职业经理人和软件开发人员,笔者在大量研究和实践的基础上,费时一年写成本书。
本书的主要目的是帮助Windows系统管理人员和开发人员迅速深入理解PowerShell语言与应用,并可开发出各种所需的系统脚本程序。本书分析了日常脚本编程中遇到的重点和难点。对于一名Windows系统管理员和.NET开发人员通过阅读本书,可以少走弯路,更快地掌握PowerShell主要功能应用及编程技巧。
本书的主要内容
本书共包括26章,各章的主要内容如下:
第1章“PowerShell简介”介绍了PowerShell的概念及微软开发该语言原因,说明了其框架机理,以及主要功能的应用范围。
第2章“安装与配置开发环境”介绍了如何搭建本书相关实例所使用的主要开发环境,说明了.NET框架是微软.NET平台上开发的基础和支持的核心技术。
第3章“对象和对象类型”介绍了语言的数据结构和常用的算法,以及对象和对象类型。
第4章“执行控制流”介绍了如何控制程序中语句的执行顺序,其中包括了条件分支,如if-else及循环等。
第5章“管道对象”介绍了管道对象的作用和使用方法。
第6章“运行脚本块”介绍了PowerShell中的脚本块(Script. block),说明其如何操作对象序列。
第7章“运行函数”介绍了为什么函数是PowerShell中抽象提取和重用代码块的主要机制。
第8章“命令别名”介绍了别名的用途,可以用其提供用户熟悉的操作系统环境,更便于程序的移植。
第9章“提供程序”介绍了Shell扩展机制之一的项的概念,以及Shell如何与一些内置的提供程序一起发布给用户。
第10章“脚本文件”介绍了PowerShell的脚本文件用来保存已有并可多次重用的代码,使用户更多地关注脚本的实现原理,而不是记忆基本参数。
第11章“错误处理和调试”通过实例说明了如何在错误地输入数据及隐含错误的情况下捕获并处理异常。
第12章“脚本签名”介绍了脚本签名如何用来保护用户代码在发布之后和用户使用之前不会被篡改。
第13章“Shell环境及其配置”描述了如何获取Shell环境的设置,并且配置Shell的常用选项。
第14章“扩展类型系统”介绍了PowerShell的类型系统,内置的类型适配器和类型扩展如何协同工作,以实现所有代码中存在的类型。
第15章“获取帮助”阐述了如何在PowerShell中获取任何命令的参数和使用方法,以及如何使用内置的帮助获取参数更多详细的信息,并且使用网络搜寻的信息创建自己的帮助。
第16章“进程和服务”分析了如何操作进程及其属性,包括启动和终止进程,查询并显示进程信息,以及管理系统服务。
第17章“输入和输出”介绍了PowerShell操作文件的机制、如何读取不同的数据格式并生成自己的数据,以及如何使用正则表达式从文本块中获取数据。
第18章“管理PC”说明了如何处理由其他程序触发的错误,包括如何监视系统各组件和用户的操作。
第19章“PowerShell和万维网”介绍了如何使用HTTP协议下载文件和网页并从中提取所需部分,然后介绍了如何通过远程网站新闻来源更新下载feed数据并用自定义的脚本操作,最后介绍了如何调用Web Service和远程主机上的程序发送命令取回数据。
第20章“管理服务器”分析了系统管理工具的语法,介绍了如何提升系统管理的效率。
第21章“与COM对象互交”介绍了针对Microsoft Office工具,如Word、Excel,以及Internet Explorer浏览器的自动化编程。
第22章“使用WMI管理Windows”分析了PowerShell作为管理工具如何使得与WMI对象的交互简单化。
第23章“PowerShell社区扩展”介绍了PowerShell社区的扩展,用户可以以附加脚本或者包含新cmdlet的管理单元的形式发布现有工具集中缺少的功能。
第24章“PSEventing:PowerShell中的.NET事件”分析了PSEventing免费的脚本组成的开源工具,并通过将这些脚本以Shell管理单元的形式加载到PowerShell中以提供事件操作的支持。
第25章“使用PowerTab加强Tab键自动补全”讲述了PowerTab的主要特性,这将使用户能够更容易地使用命令提示符。
第26章“PowerShell的安全性”说明安全模型的概念,并且详细介绍PowerShell的安全特性,以及如何用其编写安全的脚本。
附录A~附录D提供了PowerShell的功能,供读者快速查询。
如何阅读本书
本书依据读者循序渐进地学习PowerShell的顺序设立章节顺序,建议初学者从前至后阅读。由于PowerShell编程实用性很强,建议首先通读本书,主要理解概念和语法,并调试书中的实例。然后尝试调试实例脚本,并应用在自己编写的新的脚本程序中。
阅读程序语法是一个反复又枯燥的过程,读者只有通过反复研读才能逐渐提高自己的编程水平。在此基础上,还需要应用这些知识,如可以尝试写一些脚本程序进行系统调用。然后在实践过程中再次查阅本书及源代码,这样才能达到掌握PowerShell的目的。
致谢
笔者真诚地感谢电子工业出版社对本书的重视,以及所有编辑人员为本书出版所做的一切。在此书写作过程中得到了很多微软MVP朋友和一些网友的热心支持,他们对此书提出的有益建议对完善此书起到了重要作用,在此表示感谢。
由于作者水平有限,书中不足及错误之处在所难免,敬请专家和读者给予批评指正。
高阳 付海军
                                                                    2009年10月
读者与作者技术交流,可上箫心论坛http://it.crfly.com
意见反馈请发邮件至PowerShell@live.cn或者gaoyang.net@gmail.com 【目录】
第1篇  PowerShell语法
第1章  PowerShell简介 2
1.1  什么是PowerShell 3
1.1.1  PowerShell的设计目标 3
1.1.2  PowerShell的设计定位 4
1.2  微软重新使用命令行的原因 4
1.3  学习方法 5
1.4  小    结 6
第2章  安装与配置开发环境 7
2.1  PowerShell运行环境 8
2.1.1  安装要求 8
2.1.2  .NET框架 9
2.1.3  PowerShell 2.0 10
2.2  下载与安装.NET框架 10
2.2.1  安装前验证 10
2.2.2  下载.NET框架 11
2.2.3  安装.NET框架 12
2.3  下载安装PowerShell 14
2.3.1  下载PowerShell 14
2.3.2  安装PowerShell 15
2.4  运行PowerShell 17
2.4.1  运行方式 17
2.4.2  初次尝试PowerShell 18
2.5  小    结 20
第3章  对象和对象类型 21
3.1  扩展类型系统 22
3.1.1  访问对象属性 22
3.1.2  使用对象方法 23
3.1.3  对象适配器 24
3.1.4  类型扩展 27
3.2  内置类型 28
3.2.1  字符串和字符串操作 28
3.2.2  数字类型 33
3.2.3  数组与集合 35
3.2.4  字典和哈希表 39
3.3  字面类型 42
3.3.1  类型转换 43
3.3.2  访问静态成员 47
3.4  小    结 47
第4章  执行控制流 48
4.1  条件表达式 49
4.1.1  值比较 50
4.1.2  隐式类型转换 51
4.1.3  逻辑和位操作 52
4.1.4  布尔转换 56
4.1.5  字符互转换的作用 57
4.1.6  集合与条件表达式 58
4.2  分支语句 58
4.2.1  简单分支语句if/else 59
4.2.2  多分支语句switch 59
4.3  循环 62
4.3.1  简单循环语句while 62
4.3.2  循环和计数器 64
4.3.3  遍历集合的循环语句for each Loop 64
4.3.4  控制循环执行语句
break和continue 65
4.4  小    结 67
第5章  管道对象 68
5.1  传统基于文本的管道 69
5.2  基于对象的管道 69
5.3  使用Foreach-Object处理集合 71
5.4  使用Where-Object过滤集合 72
5.5  新增或删除指定对象的属性 73
5.6  排序集合 74
5.7  管道树 75
5.8  分类对象 75
5.9  采集对象统计信息 76
5.10  检测对象间的变化和不同 77
5.11  管道对象和功能编程 78
5.12  小    结 78
第6章  运行脚本块 79
6.1  定义脚本块 80
6.2  返回值和参数 81
6.3  处理管道输入 86
6.3.1  变量作用域 88
6.4  将字符串作为表达式调用 93
6.5  脚本块作为委托 95
6.6  小    结 96
第7章  运行函数 97
7.1  定义函数 98
7.1.1  函数体 98
7.1.2  函数参数 100
7.1.3  通过引用传递参数 102
7.1.4  返回值 103
7.1.5  作用域规则 104
7.2  过滤器 107
7.3  函数和脚本块 110
7.3.1  实现新的控制结构 110
7.3.2  脚本块策略 113
7.4  小    结 115
第8章  命令别名 116
8.1  使用别名 117
8.1.1  创建别名 117
8.1.2  修改别名 119
8.1.3  导入/导出别名 121
8.2  别名提示、技巧和缺陷 124
8.2.1  名称冲突 124
8.2.2  复杂别名 126
8.2.3  删除破损别名 127
8.3  内置别名 129
8.3.1  类cmd.exe别名 129
8.3.2  类Unix别名 131
8.3.3  便捷别名 132
8.4  小    结 134
第9章  提供程序 135
9.1  列举提供程序 136
9.2  驱动器 137
9.2.1  驱动器作用域 140
9.2.2  浏览驱动器 141
9.3  提供程序的能力 142
9.3.1  基本提供能力 142
9.3.2  驱动器提供程序 142
9.3.3  项提供程序 142
9.3.4  项容器提供程序 142
9.3.5  导航提供程序 143
9.3.6  项内容提供程序 143
9.3.7  项属性提供程序 143
9.3.8  动态项提供程序 144
9.3.9  项安全描述提供程序 144
9.4  小    结 144
第10章  脚本文件 145
10.1  创建脚本 146
10.1.1  调用脚本 146
10.1.2  传递参数 147
10.1.3  返回值 151
10.2  从其他环境中执行脚本 152
10.3  开发和维护脚本库 153
10.3.1  以dot sourcing方式包含库 154
10.3.2  库路径 154
10.4  小    结 155
第11章  错误处理和调试 156
11.1  处理错误 157
11.1.1  常见错误处理参数 158
11.1.2  诱捕错误 161
11.1.3  捕捉非终止性错误 170
11.1.4  抛出错误 172
11.2  调试代码 177
11.2.1  打印调试 178
11.2.2  步进调试脚本和中断执行 186
11.2.3  跟踪脚本执行细节 188
11.3  小    结 192
第12章  脚本签名 193
12.1  代码签名如何工作 194
12.1.1  保证脚本的完整性 194
12.1.2  保证原始脚本 194
12.2  管理证书 195
12.3  创建自签名证书 197
12.3.1  创建认证证书 197
12.3.2  发行代码签名证书 200
12.4  签发脚本 204
12.5  在其他电脑中运行脚本 208
12.6  小    结 209
第2篇  PowerShell基础应用
第13章  Shell环境及其配置 211
13.1  Shell主机 212
13.2  用户配置脚本 214
13.2.1  设置所有用户和
Shell 214
13.2.2  设置所有用户使用的特定Shell 215
13.2.3  设置特定用户和所有Shell 215
13.2.4  设置特定用户和特定Shell 215
13.3  使用已保存控制台配置工作 216
13.4  改变提示设置 217
13.5  小    结 219
第14章  扩展类型系统 220
14.1  修改对象和类型 221
14.1.1  为单对象新增成员 221
14.1.2  为类的所有实例新增成员 226
14.2  扩展对象的格式 227
14.2.1  自定义视图 230
14.3  小    结 232
第15章  获取帮助 233
15.1  帮助系统 234
15.1.1  基础知识 234
15.1.2  参数的详细信息 236
15.1.3  高级技巧 238
15.2  获取命令信息 244
15.3  获取对象信息 246
15.4  利用Internet获得帮助 248
15.5  小    结 252
第16章  进程和服务 253
16.1  使用进程 254
16.1.1  获取进程列表 254
16.1.2  启动和停止进程 255
16.1.3  进程及其窗口 256
16.1.4  获取进程依赖的库 257
16.1.5  获取程序发布的信息 258
16.1.6  设置进程优先级 259
16.2  管理服务 259
16.2.1  改变服务状态 261
16.2.2  改变服务的属性 261
16.2.3  分析服务的依赖性 262
16.3  小    结 262
第17章  输入和输出 263
17.1  读取内容 264
17.2  写入内容 266
17.3  指定编码方式 268
17.3.1  获取二进制内容 269
17.3.2  不同Unicode编码 270
17.4  从文本中提取数据 273
17.4.1  查找符合正则表达式的匹配 273
17.4.2  查找文件中的字符串 274
17.5  小    结 274
第3篇  PowerShell高级应用
第18章  管理PC 276
18.1  使用Windows事件日志 277
18.1.1  查看事件日志 277
18.1.2  读取事件日志 278
18.1.3  写入事件日志 280
18.1.4  搜索事件日志 283
18.1.5  管理事件日志 285
18.1.6  创建事件日志 290
18.2  性能计数器 291
18.2.1  Consuming Counter Data 292
18.2.2  监视程序 292
18.3  桌面计算机维护 293
18.3.1  维护计算机 294
18.3.2  监控磁盘空间 303
18.3.3  用户管理 304
18.3.4  设置桌面选项 310
18.4  维护网络 322
18.4.1  使用网络设置 322
18.4.2  设置网络适配器 328
18.4.3  配置Windows防火墙 338
18.5  Windows排错 340
18.5.1  启动故障排错 340
18.5.2  查看服务依存性 343
18.5.3  查看硬件问题 350
18.5.4  检查网络故障 352
18.6  证书存储 354
18.6.1  定位证书 354
18.6.2  管理证书 364
18.7  小    结 371
第19章  PowerShell和万维网 373
19.1  基础 374
19.1.1  从网站获取文件 374
19.1.2  设置连接选项和调试连接问题 377
19.2  测试和验证网站 379
19.2.1  使用Test-Url验证页是否存在 380
19.2.2  检查网页是否包含破损的链接 381
19.3  使用新闻订阅Feed 383
19.3.1  获取Feed 383
19.4  调用WebService 387
19.4.1  使用HTTP GET请求
调用Web Service 388
19.4.2  使用HTTP POST请求调用Web Service 389
19.4.3  使用SOAP协议调用Web Service 391
19.5  处理FTP事务 393
19.5.1  从FTP服务器下载文件 393
19.5.2  上传文件到FTP服务器 394
19.6  小    结 395
第20章  管理服务器 396
20.1  管理Internet信息服务 397
20.1.1  启用IIS 7.0 399
20.1.2  查看IIS 7.0配置 400
20.1.3  新建网站 409
20.1.4  创建应用程序池 412
20.1.5  启动和停止网站 414
20.2  管理网络服务 418
20.2.1  查看DNS配置 418
20.2.2  设置DNS服务器选项 426
20.2.3  查看DNS区域 429
20.2.4  创建DNS区域 431
20.2.5  管理WINS和DHCP 433
20.3  管理终端服务 435
20.3.1  设置终端服务选项 435
20.3.2  管理用户 442
20.4  配置群集服务 452
20.4.1  检查群集服务器 452
20.4.2  管理节点和移除群集 457
20.5  管理域用户 462
20.5.1  创建OU 462
20.5.2  创建域用户 464
20.5.3  修改用户属性 466
20.5.4  使用.csv文件创建用户 467
20.5.5  创建域组 468
20.5.6  添加用户到域组 470
20.6  管理SQL Server 2008 471
20.6.1  SQL Server2008环境和提供程序 471
20.6.2  生成数据库脚本 475
20.7  小    结 486
第21章  与COM对象互交 487
21.1  COM如何工作 488
21.2  PowerShell如何支持COM 488
21.3  通过COM界面脚本编程 490
21.3.1  Microsoft Word自动化 490
21.3.2  Microsoft Excel脚本 498
21.3.3  驱动Internet Explorer 503
21.4  与Windows脚本宿主代码协同工作 506
21.4.1  执行代码 507
21.4.2  在MSScriptControl中公开对象 509
21.5  小    结 510
第22章  用WMI管理Windows 511
22.1  WMI概述 512
22.2  WBEM和WMI组件 512
22.2.1  通用信息模型 512
22.2.2  网络传输 513
22.2.3  对象发现 514
22.3  PowerShell对WMI的支持 514
22.3.1  WMI查询工具
Get-WmiObject 515
22.4  对WMI对象的语言支持 517
22.4.1  获得类和命名空间清单 520
22.4.2  WMI系统属性 522
22.5  查询硬件设备 523
22.6 获取软件信息 524
22.6.1 操作系统更新 524
22.6.2  已安装程序 525
22.7  网络配置 526
22.8  生成WMI代码 527
22.8.1  通过Scriptomatic生成WMI代码 527
22.9  小    结 529
第23章  PowerShell社区扩展 531
23.1  安装和配置 532
23.1.1  标签扩展 532
23.1.2  编辑配置文件 533
23.1.3  获取帮助 533
23.2  文件系统工具 535
23.2.1  导航助手 535
23.2.2  NTFS助手 536
23.2.3  压缩和归档文件 539
23.3  网络工具 541
23.4  执行过程和命令 542
23.5  XML工具 544
23.6  使用图像文件 547
23.7  剪贴板助手 548
23.8  Internet Explorer订阅存储 552
23.9  实用程序 554
23.10  小    结 557
第24章  PSEventing:PowerShell中的.NET事件 558
24.1  PSEventing 559
24.2  事件处理机制 559
24.3  FileSystemWatcher 560
24.4  监视写入系统事件日志的条目 562
24.5  处理WMI事件 563
24.6  检测脚本是否被用户终止 565
24.7  使用脚本块作为事件处理 567
24.8  小    结 569
第25章  使用PowerTab加强
Tab键自动补全 570
25.1  安装、禁用和卸载PowerTab 571
25.2  Power Tab的工作原理 573
25.2.1  数据栅格弹出窗口 575
25.3  配置PowerTab 576
25.3.1  智能感知补全程序 577
25.3.2  Tab扩展数据库 579
25.4  小    结 581
第26章  PowerShell的安全性 582
26.1  安全概述 583
26.1.1  什么是安全 583
26.1.2  安全风险 583
26.2  安全模型 584
26.2.1  欺诈模型介绍 584
26.2.2  通过STRIDE模型分类 584
26.2.3  安全基础 585
26.2.4  黑名单/白名单 585
26.2.5  授权认证和角色 586
26.2.6  输入校验 586
26.2.7  代码注入 587
26.3  PowerShell环境的安全性 588
26.3.1  默认安全 588
26.3.2  管理命令路径 589
26.3.3  选择脚本执行策略 589
26.4  脚本签名 591
26.4.1  公钥加密及摘要 591
26.5  编写安全脚本 592
26.5.1  使用SecureString类 592
26.5.2  使用凭据 594
26.5.3  避免Invoke-Expression 597
26.6  小    结 598
附录A  PowerShell与其他语言的比较 599
附录B  管理实例 619
附录C  PowerShell语法 629
附录D  PowerShell语言快速参考 642
实例目录
例3-1  使用.NET对象支持的Type()方法来获取对象的类型 22
例3-2  查找一个字符串中是否包含另外一个字符串 23
例3-3  不传递参数调用方法时不能省略后面的圆括号 23
例3-4  使用PSBase属性获取原始的未经适配器处理的对象 24
例3-5  读取XML文件中的内容 25
例3-6  说明Internet Explorer COM对象在PowerShell中如何工作 25
例3-7  获取System.Diagnostics.Process类型的扩展属性 27
例3-8  获取Process类型的所有扩展成员 28
例3-9  用一对单引号或者双引号括起字符序列创建字符串 29
例3-10  使用转义字符反引号“`”处理引号转义 29
例3-11  包含`a字符的字符串 29
例3-12  字符串的插入功能 31
例3-13  完全摆脱$process变量 31
例3-14  检测字符串是否以任意字母开头并以“s”或“n”结束 32
例3-15  如何来匹配类似域名的字符串 32
例3-16  获取运行中程序的内存使用情况 34
例3-17  罗列其所有的元素并用逗号分隔创建数组 35
例3-18  创建空数组的方法 36
例3-19  通过起始和结束数字的数值区间序列来建立数组 36
例3-20  识别嵌套的数组语法并且将其转换为一个对象 37
例3-21  使用方括号[]来访问数组元素 37
例3-22  获取数组的第1个和最后一个元素 37
例3-23  用加运算符串联数组对象 38
例3-24  从对象集中搜索元素 39
例3-25  创建个人记录字典 40
例3-26  通过字面类型访问类型 42
例3-27  将字符串转换为整型 44
例3-28  从OrderedDictionary对象转换到哈希表 45
例3-29  使用PSBase替代适配器视图获取真实的对象类型 46
例3-30  获取一个静态属性值 47
例4-1  比较一个变量值是否小于7 49
例4-2  比较字符串 51
例4-3  用大小写比较两个字符串 51
例4-4  比较字符串和数字类型 52
例4-5  检测一个文件是否具有.txt后缀并且大小超过10 KB 52
例4-6  检验文件是否为今天创建或者修改的 53
例4-7  检查一个文件是否具有.txt后缀,或者只读的 53
例4-8  检查一个文件是否为只读 53
例4-9  使用-band按位与数字3和1 54
例4-10  非零值转换为$true 56
例4-11  非零长度的字符串被转换为$true 56
例4-12  至少有一项的集合会返回$true 56
例4-13  将Word对象转换为布尔类型的值 57
例4-14  获取文件属性,System.IO.FileAttributes枚举对象可以很容易地转换为字符串 57
例4-15  过滤集合 58
例4-16  获取字符串“LiMing” 58
例4-17  隐式类型转换的作用 58
例4-18  用多层复杂分支判断文件大小 59
例4-19  switch语句执行所有匹配的块 60
例4-20  使用正则表达式来执行操作 61
例4-21  为switch传递一个数字集合并判断数字类型 61
例4-22  等待notepad.exe进程退出 62
例4-23  do-while语句确定条件使循环重复执行 63
例4-24  使用for循环重写前一节的while循环 64
例4-25  使用for循环来达到遍历集合 64
例4-26  获取第1个有.log后缀的文件 65
例4-27  使用continue语句在遍历集合的过程中跳过偶数输出所有
的奇数 66
例4-28  针对两个嵌套的foreach循环 66
例4-29  在外部循环中增加break语句 66
例5-1  将集合中所有元素与2相乘并返回一个新的集合 69
例5-2  获取所有以“Error”开头的字符串 70
例5-3  按照法语的习惯比较字符串 70
例5-4  将原始未排序的集合在排序之前保存在$unsort变量中 70
例5-5  将一些文件按照后缀分类: 70
例5-6  快速统计数组值 71
例5-7  脚本块在所有的对象上执行 72
例5-8  提取当前文件夹中文件的文件名和最后访问时间 73
例5-9  为文件列表增加LastAccessWeekDay属性 73
例5-10  传递first和last参数 73
例5-11  按照占用的内存大小排序进程列表 74
例5-12  使用Get-Process和Stop-Process来获取和终止进程 75
例5-13  根据系统服务的状态将集合分类 76
例5-14  收集与所有文件大小相关的信息 76
例5-15  检测当前的文件夹和昨天备份之间的不同 77
例5-16  传递-confirm参数给copy命令 77
例6-1  将脚本块赋值给一个变量 80
例6-2  获取脚本块的属性和方法 80
例6-3  多次执行脚本块,并通过不同的变量来访问它 81
例6-4  返回数字的脚本块 82
例6-5  使用return语句终止Write-Host命令的输出 82
例6-6  单个脚本块返回多个数字组成的数组 83
例6-7  演示$args的使用方法 83
例6-8  两个数相加时使用参数类型定义转换值类型 85
例6-9  调用者没有提供给$lastName参数值时使用“Unknown”默认值 85
例6-10  为$greeter脚本块的$lastName赋予默认值 86
例6-11  在$greeter中将$firstName参数设置为强制参数 86
例6-12  演示传递脚本块给ForEach-Object并获取为所有文本文件最后的写入时间 86
例6-13  使用process段过滤数字集合并返回比5大的数字 87
例6-14  演示如何创建用于对管道中传入的所有数字求和脚本块 87
例6-15  累加管道中的所有元素 87
例6-16  计算特定日期和当前目录下文本文件最后修改时间之间的天数 88
例6-17  在$personAction脚本块中为$name变量赋值 89
例6-18  使用其获取$name变量的信息 90
例6-19  以$personAction脚本块为例把$name变量定义为全局变量 91
例6-20  演示如何在脚本块中隐藏变量 91
例6-21  在没有指定前缀的情况下为同名变量赋新值 92
例6-22  在脚本块中声明变量 92
例6-23  在同一个管道中的脚本块共享相同的作用域 93
例6-24  如何使用Invoke-Expression 94
例6-25  如何使用cmdlet创建允许用户输入表达式的计算程序 94
例6-26  如何声明脚本块并转换为委托 95
例7-1  使用函数输出字符 98
例7-2  获取之前定义的函数 99
例7-3  获取当前函数的信息 99
例7-4  如何使用Definition属性 99
例7-5  接收两个参数并将其和输出到控制台 100
例7-6  在函数中强制类型转换为整形参数 100
例7-7  格式化日期并输出到控制台 101
例7-8  强制通过抛出异常的形式使用默认值 101
例7-9  Format-Date函数在脚本块中声明变量 101
例7-10  创建函数交换两个变量值 102
例7-11  使用引用方式重写SwapValue函数 102
例7-12  在循环中输出多个对象的函数 103
例7-13  在集合中搜索对象的函数 103
例7-14  把对象写到控制台 104
例7-15  嵌套函数 104
例7-16  在当前作用域中覆盖父作用域中的同名函数 105
例7-17  在global和local作用域中声明同名函数 106
例7-18  定义接收文件的管道 107
例7-19  使用过滤器定义接受文件的管道 108
例7-20  定义一个ignore函数 111
例7-21  添加调试信息 112
例7-22  追踪零操作并忽略所有错误 113
例8-1  检索在系统中注册的cmdlet的数目 117
例8-2  调用New-Alias实现输出 117
例8-3  返回所有以l开头的别名 118
例8-4  获取以l开头的别名 118
例8-5  获取所有以l开头的别名 119
例8-6  Test-Path cmdlet判断某个文件或目录是否存在 119
例8-7  更新log别名使用Write-Verbose替换Write-Host 119
例8-8  将log别名的指向改回Write-Host 120
例8-9  通过使用Set-Item cmdlet设置相应的记录 120
例8-10  通过设置别名记录的内容来使别名重新指向 120
例8-11  移除log别名的方法 120
例8-12  导出的别名文件为文本格式 121
例8-13  强制覆盖已经存在的别名 122
例8-14  通过指定过滤器的方式只导出部分别名 122
例8-15  分多次将别名导出 123
例8-16  将别名导出为脚本形式 123
例8-17  将别名导出为用逗号分隔的文件 123
例8-18  创建名为“Get-Command”的别名 124
例8-19  将别名dirr指向dir-recurse函数的方法 127
例8-20  创建一个完全错误的别名 127
例8-21 128
例8-22  通过ForEach-Object将对应的别名删除 128
例8-23  在cmd.exe下设置变量并获取其中的内容 130
例8-24  在PowerShell中执行相同操作的方法 130
例9-1  键入Get-PSProvider命令列出所有提供程序的清单 136
例9-2  获取所有提供程序管理单元的名称和.NET类型 136
例9-3  使用Get-PSDrive命令获取当前在系统中注册的驱动器 137
例9-4  创建docs:驱动器 138
例9-5  将网络共享\\FileServer\Public映射为本地的net:驱动器 139
例9-6  使用Remove-PSDrive移除映射的驱动器 139
例9-7  在驱动器被占用情况下强制删除的实例代码 139
例9-8  函数映射驱动器并返回项的根目录 140
例9-9  PowerShell中的目录切换 141
例9-10  获取驱动器 141
例10-1  使用Set-Content这个cmdlet来创建脚本文件 146
例10-2  在指定目录中查找文件名符合指定通配符的文件 148
例10-3  用命名参数方式重写脚本文件 148
例10-4  获取文件序列并过滤掉所有大于指定大小的文件 148
例10-5  使用脚本文件查找小于13个字节的文件 149
例10-6  创建一个访问父作用域的脚本文件 149
例10-7  在脚本文件内使用$global关键字修改父作用域变量 150
例10-8  生成对象并输出 151
例10-9  return语句返回现有对象 152
例10-10  在脚本文件中的函数中退出整个脚本文件的执行 152
例10-11  调用PowerShell.exe并把脚本块名作为参数 153
例10-12  脚本库Library1.ps1的代码 154
例10-13  更换当前目录的位置 154
例11-1  包含终止错误的Raise-TeminatingError函数的脚本文件 158
例11-2  创建脚本文件操作错误变量测试错误条件 160
例11-3  使用陷阱写一个脚本文件“Date-Traps.ps1” 161
例11-4  处理不同数据格式的转换错误 163
例11-5  将continue语句替换为break语句 166
例11-6  创建名为“Log-AllErrors.ps1”的脚本用于尝试删除某个文件 167
例11-7  生成的错误日志文件error-dump.xml的格式 167
例11-8  创建脚本DivideByZero.ps1 169
例11-9  创建一个名为“Log-NonTerminatingErrors.ps1”的脚本 172
例11-10  演示如何抛出终止错误 173
例11-11  创建名为“Function-ParametersWithExceObj.ps1”的脚本文件 174
例11-12  创建名为“Function-ParametersNonTerminating.ps1”的脚本文件 176
例11-13  创建名为“Prite-Debug.ps1”的脚本文件计算 178
例11-14 180
例11-15  创建名为“Print-DebugWithInstrument.ps1”脚本 181
例11-16  创建名为“Print-DebugOutput.ps1”脚本 182
例11-17 186
例11-18  创建新的脚本,并命名为“Count-CharactersDebug.ps1” 187
例11-19  创建名为“Trace-Command.ps1”的脚本文件 189
例12-1  列举用户管理证书 196
例13-1  获取宿主对象及其提供的内容 212
例13-2  使用PSHostUserInrerface方法 213
例13-3  PSHostUserInterface对象提供Shell属性 213
例13-4  为特定用户的Shell添加配置 215
例13-5  添加PSEventing管理单元 216
例13-6  将判断过程封装为函数Is-Administrator 218
例14-1  创建名为“Person-Define.ps1”的范例脚本 223
例14-2  在新的脚本文件Person-All.ps1中测试新创建的方法和属性 224
例14-3  列出所有后缀为“ps1”的文件 227
例14-4  使用Update-FormatData cmdlet创建自定义制表符视图 231
例15-1  显示所有以“about_”开头的cmdlet的帮助 234
例15-2  集合用管道传递给select获取唯一的分类值 235
例15-3  获取特定语言的主题或者HelpFile分类 236
例15-4  获取Get-ChildItem的-filter参数的信息 236
例15-5  获取Get-Help的parameter参数的信息 237
例15-6  演示包含处理文件和项目的Microsoft.PowerShell.Management管理单元的帮助文件 238
例15-7  使用Get-Help获取帮助主题 239
例15-8  获取Add-Content帮助主题的detail和description属性 239
例15-9  查看保存在AML文件中的例子 241
例15-10  将通过索引值访问参数的方法用于访问帮助信息中 241
例15-11  使用foreach来遍历一系列的文件 242
例15-12 242
例15-13  使用notice.txt脚本块作为查询条件来找到目标实例 243
例15-14 244
例15-15  获取动词部分的cmdlet返回所有涉及stop的cmdlet 244
例15-16  获取所有与证书处理相关的命令 245
例15-17  在控制台提示符下输入Get-Command help命令 245
例15-18  使用Get-Member cmdlet获取文件属性 246
例15-19  获取DateTime类型的静态属性 247
例15-20  验证[datetime]::Parse静态方法接收字符串参数并返回DateTime对象 247
例15-21  使用Windows脚本宿主对象的Open()方法打开URL 248
例15-22  创建一个带有单个参数的Search-Msdn函数 249
例15-23  导入System.Web并调用类 249
例15-24  使用Show-MsdnHelp函数获取对象并打开MSDN的帮助页面 250
例15-25  创建使用基于Google或者live.com搜索的函数 251
例16-1  获取所有与Process相关的cmdlet的方法 254
例16-2  按照特定属性值排序所有进程并返回顶端的5个 254
例16-3  按照WS(Working Set)属性检查工作区 254
例16-4  执行Get-Process命令 255
例16-5  尝试关闭Notepad窗口 256
例16-6  获取到所有Google搜索的浏览器窗口 257
例16-7  获取PowerShell的存放位置 257
例16-8  获取计算器依赖的库清单 258
例16-9  获取使用动态库的进程清单 258
例16-10  获取当前计算机中部分运行程序的发布信息清单 258
例16-11  降低安装程序msiexec.exe的优先级 259
例16-12  获取当前运行的所有服务 260
例16-13  通过服务名类似DNS*的通配符查询DNS client服务 260
例16-14  通过获取所有匹配*net*通配符获取Windows下与网络相关的服务 260
例17-1  创建一个通用脚本Get-ContentAsString.ps1 265
例17-2  创建一个名为“Format-AsHex.ps1”的脚本 269
例17-3  编写一个名为“Detect-Encoding.ps1”的脚本 272
例17-4  创建一个名为“Extract-Numbers.ps1”的脚本 273
例18-1  脚本GetEventLogs.ps1的代码 277
例18-2  GetApplicationEventLog.ps1脚本的代码 278
例18-3  创建名为“WriteAppLogToText.ps1”的脚本 278
例18-4  创建名为“WriteAppLogToXml.ps1”的脚本 280
例18-5  创建一个名为“WriteToAppLog.ps1”的脚本 281
例18-6  创建名为“WriteProcessToAppLog.ps1”的脚本 282
例18-7  创建一个名为“SearchByEventID.ps1”的脚本 283
例18-8  创建一个名为“FindMsiEvent.ps1”脚本 284
例18-9  创建一个GetSystemLogError.ps1脚本 284
例18-10  GetMessage.ps1脚本的代码 285
例18-11  创建名为“GetLogSources.ps1”的脚本 286
例18-12  创建用于查询系统日志存档策略的脚本文件GetEventLogRetentionPolicy.ps1 287
例18-13  创建脚本SetEventLogRetentionPolicy.ps1修改日志的存档策略 287
例18-14  CreateEventLog.ps1脚本创建事件日志 290
例18-15 292
例18-16  针对意外终止的应用程序创建一个监视脚本Monitor-Crashes.ps1 293
例18-17  创建名为“ReportDiskDriveConfiguration.ps1”的脚本 294
例18-18  创建名为“ReportDiskPartition.ps1”的脚本获取系统中存在的分区属性 296
例18-19  创建名为“ReportSpecificDiskPartition.ps1”的脚本来获取硬盘特定分区的配置信息 297
例18-20  创建名为“ReportLogicalDiskConfiguration.ps1”的脚本查询系统中存在的逻辑磁盘 298
例18-21  创建名为“RenameComputer.ps1”的脚本用于更改计算机名 299
例18-22  将EnablePrivileges的属性设置为$true 301
例18-23  创建名为“QueryOldFiles.ps1”的脚本 303
例18-24  创建名为“CreateLocalUser.ps1”的脚本 305
例18-25  创建名为“CreateLocalGroup.ps1”的脚本 307
例18-26  创建名为“EnableDisableUser.ps1”的脚本禁用或启用特定账户的权限 308
例18-27  创建名为“AuditScreenSaver.ps1”的脚本 311
例18-28  创建一个screensaver表 314
例18-29  创建名为“ReportPowerConfig.ps1”的脚本 316
例18-30  创建名为“SetPowerConfig.ps1”的脚本用于设置电源计划 319
例18-31  创建名为“GetNetAdapterStatus.ps1”的脚本用于检测网络适配器的状态 322
例18-32  创建名为“GetNetAdapterConfig.ps1”的脚本收集特定网络适配器的用于排错的详细信息 325
例18-33  创建名为“NetworkAdapterConfigFiltered.ps1”的脚本过滤无用属性 327
例18-34  创建一个名为“GetNetID.ps1”的脚本 329
例18-35  创建名为“WriteNetworkAdapterInfoToExcel.ps1”的脚本 330
例18-36  创建名为“FindConfigurationOfConnectedAdapters.ps1”的脚本 332
例18-37  创建名为“SetStaticIP.ps1”的脚本 333
例18-38  创建名为“WorkWithDHCP.ps1”的脚本 336
例18-39  创建名为“ParseFWConfig.ps1”脚本可以检测到这些端口 339
例18-40  创建名为“EnableRemoteAdmin.ps1”的脚本 340
例18-41  创建名为“EnableShareFolders.ps1”的脚本 340
例18-42  创建名为“DisplayBootConfig.ps1”脚本读取引导配置 341
例18-43  创建名为“DetectStartupPrograms.ps1”的脚本 342
例18-44  创建名为“ServiceDependencies.ps1”的脚本 344
例18-45  创建用于检查硬件驱动的脚本CheckDeviceDrivers.ps1 346
例18-46  创建名为“AutoServiceNotRunning.ps1”的脚本 349
例18-47  创建名为“CheckSignedDeviceDrivers.ps1”的脚本 350
例18-48  创建名为“GetActiveNicAndConfig.ps1”的脚本 352
例18-49  创建名为“FindCertificates.ps1”脚本 356
例18-50  创建名为“ListCertificates.ps1”脚本 357
例18-51  创建名为“FindExpiredCertificates.ps1”脚本 360
例18-52  为此创建名为“FindCertificatesAboutToExpire.ps1”的脚本 362
例18-53  创建名为“InspectCertificate.ps1”的脚本 364
例18-54  创建名为“ImportCertificate.ps1”的脚本 366
例18-55  创建名为“DeleteCertificate.ps1”的脚本 368
例19-1  改写脚本Get-Url.ps1创建为脚本GetFile-Url.ps1 376
例19-2  重建一个WebProxy对象 378
例19-3  创建一个HEAD请求 380
例19-4  创建一个用于检测网页链接的脚本Get-Links.ps1 381
例19-5  创建新的脚本GetBase-Links.ps1 382
例19-6  创建名为“Get-AtomFeed.ps1”的脚本 383
例19-7  Get-RssFeed.ps1脚本 385
例19-8  获取RDF格式的Get-RDFeed.ps1脚本 386
例19-9  Get-Rss.ps1脚本的代码 386
例19-10  创建名为“Call-WebServiceGet.ps1”的代码 388
例19-11  创建名为“Call-WebServicePost.ps1”的脚本 389
例19-12  SOAP协议传输消息的一般格式 391
例19-13  创建名为“Call-WebServiceSoap.ps1”的脚本 391
例19-14  创建名为“Get-Ftpfile.ps1”脚本文件 393
例19-15  创建名为“Put-Ftpfile.ps1”的脚本 394
例20-1  创建一个名为“Find-IIS 7.0WMIClass.ps1”脚本 400
例20-2  创建名为“Get-Sites.ps1”脚本 400
例20-3  创建名为“Get-IISPath.ps1”的脚本 401
例20-4  创建名为“Get-AppPool.ps1”的脚本 403
例20-5  创建名为“Get-IIS 7.0AppPoolDefaultSettings.ps1”的脚本 405
例20-6  创建名为“Get-SiteLimits.ps1”的脚本 407
例20-7  创建名为“List-VirtualDirectory.ps1”的脚本 408
例20-8  创建名为“Creat-site.ps1”的脚本 410
例20-9  创建名为“Create-ApplicationPool.ps1”的脚本 412
例20-10  创建名为“Start-AllWebSites.ps1”的脚本 414
例20-11  创建名为“Stop-AllWebSites.ps1”的脚本 415
例20-12  创建名为“StartStop-Site.ps1”的脚本 416
例20-13  创建名为“Get-DNSServerConfig.ps1”的脚本 419
例20-14  创建名“Display-RootHints.ps1”的脚本 422
例20-15  创建名为“Query-DNSArecords.ps1”的脚本 423
例20-16  创建名为“Set-DNSServerConfig.ps1”的脚本 426
例20-17  创建名为“Report-DNSZoneConfig.ps1”的脚本 429
例20-18  创建名为“Create-DNSZone.ps1”的脚本 431
例20-19  创建名为“Manage-WinsDHCP.ps1”的脚本 434
例20-20  创建名为“Report-ClientSettings.ps1”的脚本的名称 436
例20-21  创建名为“Disable-Logons.ps1”的脚本 438
例20-22  创建名为“Configure-ClientProperties.ps1”的脚本 440
例20-23  创建名为“Report-ClientSetting.ps1”的脚本 443
例20-24  创建名为“Grant-UserTSpermission.ps1”的脚本 444
例20-25  创建名为“Configure-ClientColor.ps1”的脚本 445
例20-26  创建名为“Configure-ClientEnvironment.ps1”的脚本 448
例20-27  创建名为“Disable-ActiveDesktop.ps1”的脚本 450
例20-28  创建名为“List-ClusterWMIClasses.ps1”的脚本 452
例20-29  创建名为“Check-ClusterConfig.ps1”的脚本 455
例20-30  创建名为“AddEvict-Node.ps1”的脚本 457
例20-31  创建名为“Remove-Cluster.ps1”的脚本 460
例20-32  创建名为“Create-OU.ps1”的脚本 463
例20-33  创建名为“Create-User.ps1”的脚本 464
例20-34  调用SetInfo()方法将修改保存到Active Directory中 466
例20-35  CreateAndEnable-User.ps1脚本的代码 468
例20-36  创建名为Create-Group.ps1的脚本 469
例20-37  创建名为“AddUserToGroup.ps1”的脚本 470
例21-1  创建Get-DocumentText.ps1脚本 490
例21-2  创建名为“Get-DocumentParagraph.ps1”的脚本 492
例21-3  创建名为“Get-DocumentSentences.ps1”的脚本 492
例21-4  创建一个名为“Get-DocumentWords.ps1”的脚本 493
例21-5  创建一个名为“New-Document.ps1”的脚本 494
例21-6  创建一个名为“Insert-RedText.ps1”的脚本 495
例21-7  创建一个名为“SpellCheck-Text.ps1”的脚本 497
例21-8  从工作表中读取单元格值 499
例21-9  创建名为“Get-CellInRange.ps1”的脚本 501
例21-10  创建一个名为“Export-ProcessToExcel.ps1”脚本 502
例21-11  创建一个名为“Search-GoogleCom.ps1”的脚本 504
例21-12  创建一个名为“Get-WebSearchResults.ps1”的脚本 505
例21-13  Jscript脚本的源代码 506
例21-14  VBScript脚本的代码 507
例21-15  创建一个名为“JScriptEval.ps1”的脚本 507
例21-16  创建一个名为“VBScriptEval.ps1”的脚本 508
例21-17  创建一个新的脚本文件“JScriptCodeObject.ps1” 509
例24-1  编写名为“WatchDeletedFiles.ps1”的脚本 560
例24-2  WatchEventLog.ps1脚本的代码 562
例24-3  使用WMI事件来获取Windows时间服务(W32Time)的停止时间 563
例24-4  脚本Watch_W32Time.ps1的代码 564
例24-5  编写文件夹监视脚本“WatchDeletedFilesCtrlC.ps1” 565
例24-6  扩展文件系统监视程序的脚本并命名为“WatchDeletedCreatedFiles.ps1” 567
例26-1  创建名为Start-LocalUserManager的函数 595
例26-2  Where-Object cmdlet脚本 597
例26-3 598

 

请使用浏览器的分享功能分享到微信等