Windows PowerShell实战指南(第2版)

978-7-115-40967-6
作者: 【美】Don Jones(道·琼斯) Jeffery Hicks(杰弗瑞·希克斯)
译者: 宋沄剑何文通黄钊吉陈畅亮
编辑: 王峰松
分类: Windows

图书目录:

详情

本书详细讲解了Windows系统的命令行工具PowerShell的使用,涵盖了最基本的命令和复杂的高级功能,对Windows网络管理员和其他平台的网络管理员来说都是不可多得的一本实用教程。本书不需要读者具有编程经验,任何对Windows系统感兴趣的人都可以阅读。

图书摘要

版权信息

书名:Windows PowerShell实战指南(第2版)

ISBN:978-7-115-40967-6

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

• 著    [美] Don Jones Jeffery Hicks

  译    宋沄剑  何文通  黄钊吉  陈畅亮

  责任编辑 王峰松

• 人民邮电出版社出版发行  北京市丰台区成寿寺路11号

  邮编 100164  电子邮件 315@ptpress.com.cn

  网址 http://www.ptpress.com.cn

• 读者服务热线:(010)81055410

  反盗版热线:(010)81055315


Original English language edition, entitled Learn Windows PowerShell in a Month of Lunches, 2nd Edition by Don Jones & Jeffery Hicks, published by Manning Publications, USA. Copyright © 2014 by Manning Publications. Simplified Chinese-language edition, Copyright © 2015 by Posts & Telecom Press. All rights reserved.

本书中文简体字版由Manning Publications授权人民邮电出版社独家出版。未经出版者书面许可,不得以任何方式复制或抄袭本书内容。

版权所有,侵权必究。


PowerShell既是编程语言,也是一种管理Shell。通过PowerShell几乎可以管理Windows的方方面面。本书是为忙于运维的管理员所编写的参考指南。只需要1个月、每天1小时,读者就能够学到让自己的工作变得更轻松的实战技能。本书章节安排合理,每章只需要1小时,即可以零编程基础开始学习PowerShell。本书作者是PowerShell界的泰斗Don Jones与Jeffery Hicks。他们都是多年的PowerShell MVP,并以简洁、易入门的培训和写作风格而著称。


本书的内容在我看来就像在教室上课一样生动,通过本书包含的大量实践练习,由浅入深地体会PowerShell的力量。

——Chuck Durfee

Graebel公司,高级软件工程师

由新手到高手的过程中,本书是你唯一需要的。通过阅读本书,你就能够知道Don Jones为什么是一名PowerShell界的明星。

——David Moravec

独立博客PowerShell.cz,SCCM管理员

学习PowerShell的核心指南!强烈推荐!

——Ray Booysen

法国巴黎银行BNP Paribas,开发工程师

真希望我在开始学习PowerShell时就能够看到这本书。

——Richard Siddaway

微软PowerShell MVP,IT架构师

本书不仅教会你PowerShell,还教会你如何成为PowerShell的专家。

——Nikander Bruggeman和Margriet Bruggeman

Lois & Clark IT服务公司,.NET咨询顾问


我们已经从事PowerShell教学和写作很长时间。当Don开始规划本书的第一版时,他意识到大多数PowerShell作者和讲师——包括他自己——会强迫学生将Shell作为一门编程语言学习。大多数PowerShell书籍都会通过三章或者四章进入“脚本”主题,而现在越来越多的PowerShell学习者对面向编程的学习方法避之不及。这些学生只是想将Shell作为Shell使用,至少在一开始是这样的。我们只是希望提供符合该要求的学习体验。

所以Don希望尝试这种方法。通过在WindowsITPro.com发布本书的目录,来自博客读者的大量反馈最终让本书变得更好。他希望每一章短小、目的明确且短时间内就可以掌握——他知道管理员们并没有多少闲暇时间,通常他们都是在需要的时候才会去学习。当PowerShell v3发布后,这明显是更新本书的最好时机,Don最终找到他的长期合作伙伴Jeffery Hicks共同完成本书。

我们希望本书专注于PowerShell本身,而不是大量PowerShell可以用到的技术上,比如Exchange Server、SQL Server、System Center等。我们真心认为通过学会正确使用Shell,你就可以通过自学掌握所有这些可以通过PowerShell使用的服务器级别产品。所以本书重点是使用PowerShell所需的核心技能。即使你还使用了“cookbook”风格的书(该类书中为特定管理任务提供了直接可以上手使用的答案),本书也可以帮助你理解那些书中实例的原理。对例子的理解能够帮助你更容易修改这些示例,从而完成其他任务,最终你可以从无到有构建你自己的命令。

我们希望本书不是你学习PowerShell的唯一工具。实际上,在本书提供的网站上(也就是MoreLunches.com)还提供了大量简短的内容帮助你更好地学习PowerShell。该网站提供了与本书章节对应的免费视频,从中你可以看到和听到对于核心技术的实践。我们还共同编著了《Learn PowerShell Toolmaking in a Month of Lunches》。该书同样以一天一次的方式提供了学习PowerShell脚本以及工具制作的能力。

如果你还需要其他额外帮助,我们希望你登录[www.PowerShell.org](www.PowerShell.org)。我们在该网站的多个讨论组回答问题。我们会非常高兴在你遇到任何问题卡住时拯救你。该网站还是强大活跃的PowerShell社区入口——你可以学习关于年度脚本游戏,也就是线下的PowerShell峰会,以及所有关于各个区域及本地用户组举行的PowerShell相关的活动。请加入——这是将PowerShell作为你职业生涯更强大的组成部分的方法。

请享受本书——在学习使用Shell的过程中祝你好运。


关于本书中大多数你所需知道的内容都在第1章中进行描述,但有一些事需要提前告知。

首先,如果你计划跟随我们的示例并完成动手实验,你需要一台运行Windows 8或Windows Server 2012的计算机或虚拟机。我们在第1章中进行了更详细的阐述。你也可以在Windows 7上运行这些示例,但在动手实验中有一些知识点无法进行实验。当然,使用更新版本的操作系统也是可以的,比如Windows 8.1或Windows Server 2012 R2。本书涵盖了Windows PowerShell第三版以及更新的版本;后续版本仅仅是添加了新的功能,因此本书同样适用。

其次,请准备好从头到尾,按照章节先后顺序阅读本书 。同样,我们在第一章中会进行详细解释,但背后的思想是每一章都会介绍一些新的内容,这些内容都会在下一章中被用到。请不要尝试一次性阅读完整本书——请坚持每天一章的方式。人的大脑一次只能理解有限的信息,通过将PowerShell分解为小的片段,你实际上可以更快、更彻底地学习PowerShell。

再次,本书包含大量的代码段。大多数代码段较短,因此你可以很容易地输入这些代码。实际上,我们推荐你手工敲一遍代码,这样做可以巩固核心PowerShell技能:准确地输入!较长的代码段也同样在代码清单中且可以从http://Morelunches.com(只需通过单击本书的封面图片并找到“下载”部分)进行下载,也可以通过出版社的网站 www.manning.com/LearnWindowsPowerShellinaMonthofLunchesSecondEdition进行下载。

也就是说,还有一些需要注意的惯例。代码总是以特殊字体进行显示,例子如下:

Get-WmiObject –class Win32_OperatingSystem
➥ –computerName SERVER-R2

本示例还描述了在本书中使用的行继续符。这意味着这两行在PowerShell中实际上是作为一行进行输入。换句话说,不要在Win32_OperationSystem后敲击回车键或返回键——而是在该语句右侧继续进行输入。PowerShell允许行非常长,但本书的纸张却不能容纳那么长。

有时,你还能在本书中看到代码字体,如当我们写Get-Command时。这只是为了让你知道你正在查看的是一个命令、参数或其他你将会在Shell中输入的元素。

然后是一个我们在很多章节使用的有点让人难以琢磨的主题:重音符( `)。下面是示例:

Invoke-Command –scriptblock { Dir } `
-computerName SERVER-R2,localhost

该字符在第一行的最后并不是洒出来的墨水——而是你需要输入的实际符号。在美式键盘中,重音符(或者称为沉音符)通常位于键盘的左上部分,在Esc键下面,和波浪号(~)位于同一个键位。当你在代码清单中看到重音符时,请按照原样输入它。此外,当该字符出现于行尾时——正如之前示例所示——请确保该字符是行的最后一个字符。如果在该字符之后又存在任何空格或Tab符号,重音符则无法正常生效。在本书代码段的重音符之后不会存在空格或者Tab符号。

最后,我们将会偶尔将你导向到Internet资源上。这些URL会很长并难以输入。我们会将这些URL替换为基于Manning出版社的短链接,看上去就像http://mng.bz/S085(你会在第1章中看到该链接)。

购买Learn Windows PowerShell in a Month of Lunches(Second Edition)还包含了访问由Manning出版社运营的私有论坛。在该论坛中,你可以对本书进行评价、提出技术问题并得到作者和其他用户的帮助。通过www.manning.com/LearnWindowsPowerShellinaMonthofLunchesSecondEdition或www.manning.com/jones3并单击Author Online链接来访问和订阅论坛。该页面提供了在注册后如何访问论坛的信息,以及可以得到的帮助的类型与论坛行为规范。

Manning对读者的承诺是提供一个交流的场所。在该场所,读者和读者以及读者和作者之间可以进行有价值的对话。但并不承诺有多少代表作者的参与者参与论坛,作者参与论坛都是志愿的(且不收报酬)。我们建议你尝试问作者一些有挑战性的问题,从而使他们保持兴趣。

作者在线论坛以及之前讨论内容的存档,在本书印刷时,就可以通过出版社的网站进行访问。



本书作者是PowerShell界的泰斗Don Jones与Jeffery Hicks,他们俩都是多年的PowerShell MVP,并以简洁、易入门的培训和写作风格而著称。Don在PowerShell.org撰写博客,而Jeff的博客则是jdhitsolutions.com/blog。

由于Don Jones在Windows PowerShell方面的工作,他多年获得微软公司最有价值专家(MVP)奖项。他是微软TechNet杂志的Windows PowerShell专栏的作者,在PowerShell.org写博客。他创作出版了“Decision Maker”专栏,并为Redmond杂志写博客。Don是一名多产的技术作者,自2001年以来出版了超过12本书。他还是Concentrated Technology (ConcentratedTech.com)公司的首席技术专家和高级合伙人。该公司是一家IT教育和战略咨询公司。Don使用的第一个Windows脚本语言是KiXtart,该语言可追溯至20世纪90年代中期。很快他就在1995年转移使用VBScript。他还是最早期使用微软代码名称为“Monad”产品的IT专家之一——该产品后来成为Windows PowerShell。Don住在拉斯维加斯,在世界各地提供IT培训(尤其是PowerShell方面),并在IT峰会上进行演讲。

Jeffery Hicks在Windows PowerShell方面连续多年获得微软最有价值专家奖项。他还是一个微软认证讲师以及拥有20年经验的IT老兵,大多数工作经验花在微软服务器技术的咨询上。现在他作为独立作者、培训师顾问,为全世界的客户提供服务。Jeffery为MPCMag.com中流行的Prof.PowerShell专栏撰写文章,并且是Petri IT知识库的常规贡献者。如果他不在写书,更可能是他正在为诸如TrainSignal之类的公司录制培训视频或在讨论论坛中帮助他人。你可以在Jeffery的博客http://jdhitsolutions.com/blog中查看他的最新状态。


宋沄剑,微软SQL Server MVP,SQL Server 2012 UI审查专家,Professional Association for SQL Server(PASS)北京分会联合发起人,数据库大会、TechED特约讲师,目前就职于易车网,负责易车海量数据平台的运维工作,设计自动化监控运维方案。曾任数据库高级顾问,帮助国内超过50家客户设计高可用/灾备方案。

何文通,新蛋科技有限公司信息系统部数据库管理科科长,曾任职于大型制造业公司,负责数据库运维与管理。加入新蛋公司后,主要负责MS SQL数据库运维工作,在MS SQL性能优化与故障诊断方面有丰富的实战经验。

黄钊吉,近8年数据库相关经验,目前任职于一家大型物流企业,负责数据平台规划和运维工作。主要研究SQL Server性能和高可用技术,是三届SQL Server MVP,CSDN论坛SQL版大版版主,CSDN博客专家,《SQL Server性能优化与管理的艺术》一书作者。

陈畅亮,SQL Server MVP,曾受邀参加2015年DTCC(中国数据库技术大会)作为演讲嘉宾,出版书籍《SQL Server性能调优实战》,主要研究SQL Server、MySQL、NoSQL,以及分布式环境下海量数据存储的设计与开发。


书当然不会自行书写、编辑和出版。Don希望感谢在Manning出版社那些决定在PowerShell不同种类书籍都碰碰运气的所有人,以及那些努力帮助完成本书的人。Jeffery希望感谢Don邀请他参与完成本书,并感谢所有的PowerShell社区的激情与支持。Don和Jeffery都对Manning出版社让他们继续“一个月的午餐”系列第二版心怀感激。

也感谢所有在书写阶段阅读手稿并参与审阅的同僚:Bennett Scharf, Dave Pawson, David Moravec,Keith Hill, and Rajesh Attaluri;还感谢James Berkenbile 和Trent Whiteley对手稿和代码的技术审阅。


自从2006年第一版Windows PowerShell面世以来,我们就一直在致力于对该技术进行教学推广。那时候,PowerShell的大部分使用者都是长期使用VBScript的用户,而且他们也非常期待能通过对VBScript的熟悉来学习PowerShell。于是,开展培训以及编写PowerShell书籍的作者都采用了一种和其他编程语言教学一样的方式来教学PowerShell。

但是从2009年开始发生了一些改变。越来越多没有VBScript经验的人开始学习PowerShell这门语言。因为之前我们主要关注于脚本的编写,所以对PowerShell的教学不再那么卓有成效。也就是在那个时候,我们意识到PowerShell并不仅仅是一门脚本语言,其实是一种运行命令行工具的命令行Shell。和其他优秀的Shell一样,虽然PowerShell可以通过脚本实现很复杂的功能,但脚本仅是使用PowerShell的一种方式,因此学习PowerShell并不一定需要从脚本开始。之后,我们在每年的技术演讲会议上逐渐改变了我们的教学方式,同时也将这些教学方式的变化体现在我们的教学课程中。最后,我们出版了这本书,这也是我们想出的针对非编程背景的人员教学PowerShell的最好方式。但是在开始学习之前,我们需要了解一下背景。

从Batch、KiXtart、VBScript到现在,可以看到Windows PowerShell并不是微软(或者其他公司)首次为Windows管理员提供自动化管理的工具。我们认为,有必要让你们了解为什么需要关注PowerShell这个工具。因为当你们这样做的时候,会发现花费一定的时间去学习PowerShell是值得的。想象一下,在没有使用PowerShell之前我们的工作是怎样的,在使用该工具后又有哪些变化。

没有PowerShell

Windows操作系统管理员总是喜欢通过单击用户图形化界面去完成他们的工作。GUI(用户图形化界面)是Windows操作系统的一个最大的特点——毕竟这个操作系统并不是“文字模式”。因为GUI总是让我们很轻易找到我们能做的一切,所以它是那么强大。笔者仍然还记得第一次展开活动目录下的用户和计算机的场景。通过单击各种按钮,阅读工具栏提示信息,选择下拉菜单,右键单击某些图标,来查看用户与计算机中的各项功能。GUI是使得我们能够更容易学习的一种工具。但是不幸的是,GUI并不能带来任何效率提升上的回报。如你花费5分钟在活动目录中创建一个新的用户(合理的设想下,需要填写大量的信息),之后再新建用户时,也不会更快。那么新建100个新用户就会花费500分钟来完成——没有其他任何办法使得我们输入信息以及单击操作更快,从而加快该过程。

微软之前也尝试去解决该问题,VBScript可能算是其中最成功的一次尝试。如果你需要花费一小时去编写一条VBScript语句来将CSV文件中的新用户导入到活动目录中,但是以后你可能只需要花费几秒钟就可以完成同样的工作。VBScript的问题在于微软没有全心全意地对其提供支持,微软需要确保各种对象都可以通过VBScript访问、调用,而如果开发人员因为时间的原因或者是忘记这块知识,那么你就只能卡在那儿了。例如,想通过VBScript修改网卡IP,没问题。但是,想检查网络连接的速度,那就不行了,因为没人记得可以把这个功能设置为VBScript可访问的形式。这也算是一种遗憾。 Jeffery Snover,Windows PowerShell的架构师称之为“最后一英里”。你可以通过VBScript(或者其他类似的技术)来做很多事情,但是在某些时刻总会让人失望,从来不会让我们顺利通过“最后一英里”完成之后的工作。

Windows PowerShell正是微软公司试图改善这一缺陷的尝试,让你顺利通过“最后一英里”,进而完成工作。

拥有PowerShell

微软对Windows PowerShell的定位是我们可以通过该Shell完全管理Windows系统中的功能。微软仍在继续开发GUI的控制台,但是底层执行的仍然是PowerShell命令。通过这种方式,微软保证我们可以在该Shell中完成Windows系统中任意的工作。如果需要自动化一个重复性的任务或者完成在GUI中不支持的工作,那么你可以使用该Shell来达成所愿。

很多微软的产品都已经采用了这种开发方法,如Exchange Server 2007和2010、Sharepoint Server 2010、大部分System Center产品以及Windows系统中大量的组件。接下来,越来越多的产品和Windows系统中组件会采用这个Shell。Windows Server 2012(首次采用PowerShell V3)甚至可以完全通过PowerShell或者使用基于PowerShell的GUI工具来进行管理。这也就是为什么我们要重视PowerShell。在接下来的几年,PowerShell会成为越来越多的管理功能的底层实现。

此时,我们仔细想想:如果你正在管理一个拥有很多IT工程师的团队,你希望谁的职级更高,希望谁能拿更多的薪水,是每次都要花费几分钟使用GUI来完成一个任务的人,还是一个可以通过脚本花费几秒钟自动化完成的人?无论你是来自哪个领域的IT从业人员,我们都知道应该如何选择。询问一个思科的管理员、AS/400的操作员或者Unix管理员,他们都会回答“我更希望选择可以借助命令行更有效率地完成工作的人员”。以后的Windows系统工程师可以简单分为两类,一部分会使用PowerShell,另一部分则不会。正如Don在微软2010TechEd会议上著名的言论:我们的选择是“学习PowerShell”,还是“来包炸薯条”?

我们很欣慰,你已经决定来学习PowerShell。

这本书并不是适合所有人。实际上,微软PowerShell团队已经定义了三类适用PowerShell的人群:

本书主要是针对第一类人编写的。包括开发者在内的所有人去理解该Shell如何执行命令是非常有必要的。毕竟,如果你正准备去开发一个工具或者编写一些命令,那么你应该知道这个Shell是如何运行的,这样可以保证开发出来的工具或者命令能像在Shell中运行得那么顺畅。

如果你对如何利用命令行来完成复杂的命令感兴趣,比如新建一个用户,在学习完本书后,你可以看到如何实现该功能。甚至你可以编写自己的脚本,并且该脚本可以让其他管理员任意使用。但是本书并不会很深入地讲解PowerShell的每项功能。我们的宗旨是让你能够使用该Shell,并能立即应用到生产环境。

我们也会使用多种方法来演示如何将PowerShell关联到其他的管理工具。在后续章节中,我们会以WMI(Windows Management Instrumentation)以及常用的命令作为示例。大体上,我们仅会介绍PowerShell可以与哪些技术进行关联,并且讲解它们之间是如何进行关联的。其实,这些主题甚至都可以单独出书介绍(我们会在本书适当的地方给出对应的建议)。在本书中,我们仅仅介绍跟PowerShell相关的部分。如果你对更深入地学习这部分技术感兴趣,我们将会提供针对后续学习的建议。

本书的理念是每天完成一章的学习。我们不需要在用餐时间阅读本书,因为我们只需要接近40分钟就可以完成对一章的阅读,之后再花20分钟去享用剩余的三明治以及进行对应的练习。

主要章节

第2章至第25章为本书的主要内容,算下来差不多只要花费24顿午餐的时间来完成阅读。这也就意味着你可以在一个月内完成对本书主要章节的阅读。你需要尽可能地严格遵守制订的学习计划,不需要在既定的时间里去阅读其他章节。更为重要的是,我们需要花费一定的时间去完成每个章节之后的练习题目,用以巩固我们的学习成果。当然,并不是每个章节都需要花费完整的一小时,所以有时你在上班之前有更多的时间进行练习(或者吃午餐)。

动手实验

在主要章节的结尾都布置了需要完成的实验题目。我们会给你对应的说明,甚至可能是一两个提示,但是在本书中并不会直接给出答案。这些动手实验的答案,我们会放在MoreLunches.com上,但是建议你在查看这些答案之前尽力独立完成这部分实验。

补充资料

MoreLunches.com网站中也包含了其他一些学习资料,如额外的章节、配套视频等。实际上,每个章节至少都有一段配套视频,其中包含本章节讲解的主要内容。每段视频大概只有五分钟时间。当阅读完某章节后,你可以通过该视频回顾对应章节学习的内容。同时,你可以看到本书第一版中的视频汇总。这些视频也适用于第三版的PowerShell,并且它们都是免费的。

进一步学习

本书的某些章节仅会简单介绍一些比较酷炫的技术,在对应章节的结尾部分会给出深入学习这部分技术的建议。我们会列出额外的学习资源,包含一些免费的资料。如果你有兴趣,可以借助这些资料进行深入的学习。

补充说明

在学习PowerShell的时候,有些时候我们可能会钻入死胡同去研究为什么会这样或那样运行。如果这样学习,我们就不会学到很多实用的技能,但是我们可以对这个Shell到底是什么及其工作原理有更深入的了解。我们在“补充说明”章节中会提供这方面的信息。这些信息只需要花费几分钟就可以读完。如果你是那种喜欢钻研原理部分的人,这部分信息也可以提供一些有用的材料。如果你觉得这个小节会使得你分心而不能很好地完成实践学习,那么你可以在首次阅读时忽略这个小节。当然,如果你掌握了所有章节部分的主要内容,建议再返回阅读这部分。

在本书的学习过程中,你会进行大量的PowerShell的动手实验,那么你必须构建一个属于你自己的实验环境(请记住,不要在公司的生产环境中进行测试)。

你需要在带有PowerShell的Windows中运行本书中大部分示例以及完成每章节的动手实验。环境可以是Windows Vista,Windows 7,Windows Server 2008,Windows Server 2008 R2,Windows 8或者是Windows Server 2012。但是需要注意的是,某些版本(如简易版)的操作系统中可能不存在PowerShell。如果你对PowerShell学习抱有很大的兴趣,那么你必须找到一个带有PowerShell的Windows系统。同时,有些动手实验是基于Windows 8 或者Windows Server 2012中PowerShell的新特性才能完成的。在每个动手实验开始时,我们都会特别说明你需要在什么操作系统中去完成这部分实践。我们建议,使用Windows 8或者Windows Server 2012去学习PowerShell,甚至你可以使用虚拟机。

在本书中,我们都是以64位(X64)操作系统为环境进行学习的。我们知道有两个版本:Windows PowerShell以及特定版本的图形化Windows PowerShell ISE。在开始菜单(Windows 8中是叫“开始”界面),这两个组件的64位版本显示为“Windows PowerShell”和“Windows PowerShell ISE”。32位版本的在快捷方式中会显示“X86”字样。在使用X86版本PowerShell时,在窗口栏中也会看到X86字样。如果操作系统本身就是32位的,那么你只能安装32位的PowerShell,并且不会显示X86字样。

本书中的示例基于64位版本的PowerShell和对应的ISE。如果你并不是使用的64位环境,那么有些时候运行示例时可能和我们得出的结果不一致,甚至某些动手实验部分根本无法正常进行。32位版本的PowerShell主要是针对向后兼容性。例如,一些Shell扩展程序只存在于32位PowerShell中,并且也只能导入到32(或者X86)的Shell中。除非你确实需要使用这部分扩展程序,否则我们建议你在64位操作系统上使用64位的PowerShell。微软后续主要的精力会放在64位PowerShell上;如果你现在因为使用的32位操作系统而无法进行下去,那么很遗憾,以后仍然会无法继续进行。

提示:

我们完全可以在一个独立操作系统的PowerShell环境中完成本书的所有学习。但是如果使用同一个域的两台或者三台计算机的PowerShell环境联合起来进行测试,那么某些动手实验可能会变得更有趣。在本书中,我们在CloudShare.com上创建多个虚拟机来解决该问题。如果你对这种场景感兴趣,你可以了解一下这个服务或者其他类似的一些服务。但是需要注意,CloudShare.com并不是在所有国家都可以访问。

从Windows Server 2008、Windows Server 2008 R2、Windows 7操作系统开始,我们已经可以使用第三版的Windows PowerShell。Windows Vista操作系统无法支持第三版,但是可以使用第二版PowerShell。最近发布的几个操作系统中已经预装了Windows PowerShell。如果采用老版本的操作系统,那么必须手动去安装PowerShell。当然,新版本的操作系统可能会采用更新版本的PowerShell,当然这没什么坏处。

提示:

你可以采用如下方法来检查安装的PowerShell版本:进入PowerShell控制台,输入$PSVersionTable,然后按回车键。如果返回错误或者输出结果并未显示为“PSVersion 3.0”,那么你安装的版本就不是第三版PowerShell。

第三版PowerShell可以与第二版PowerShell安装于一台机器上,也就意味着不会损坏那些依赖于第二版PowerShell的程序。另外,我们没有必要安装第一版PowerShell,安装第三版后会自动覆盖它。最近发布的微软软件都不会依赖于第一版PowerShell。

如果你使用的是老版本的PowerShell,则需访问http://download.microsoft.com,然后在搜索框中键入PowerShell 3,之后根据你的操作系统选择到对应版本的PowerShell,然后进行安装。你需要找的是Windows Management Framework程序包,PowerShell是集成在这个包中进行发布的。再次申明,你需要选择到正确的版本,X86代表32位的安装包,X64代表64位的安装包。在网站上无法找到最近发布的Windows操作系统,那是因为PowerShell已经被预装到这些系统中了。

提示:

PowerShell最低要求.Net Framework V4,当然如果能使用更新版本的Framework就更好了。我们建议同时最少也要安装.Net Framework 3.5 SP1以及.Net Framework 4.5版本,这样可以使用PowerShell更多的功能。

安装PowerShell的同时也会安装一些配套程序,其中包含Windows远程管理服务(WinRM),在本书后续章节中会讲到这部分。PowerShell采用类似Hotfix的方式进行安装,也就意味着安装后,也可以单独卸载。当然,一般来讲,你肯定不会希望去卸载它。PowerShell现在已经正式成为Windows 操作系统核心组件的一部分,因此对PowerShell的更新和其他Windows组件一样,以Windows的hotfix或者SP形式进行发布。

PowerShell包含两部分:基于文本的标准控制台(PowerShell.exe)和集成了命令行环境的图形化界面(ISE;PowerShell_ISE.exe)。我们大部分时间都会使用基于文本的控制台。当然,如果你更喜欢ISE,你也可以使用。

注意:

PowerShell ISE组件并没有预装到Server版操作系统中。如果你需要使用,那么你需要进入Windows的功能(使用“服务器管理器”),然后手动添加ISE功能(你也可以打开PowerShell的控制台,再执行Add-WindowsFeaturePowerShell -ise)。在未包含完整GUI模式的操作系统(如Server Core版本的系统)对应的安装程序中并没有包含ISE的安装程序。

在你继续学习PowerShell之前,建议花几分钟去设置Shell的显示界面。如果你使用基于文本的控制台,那么强烈建议你修改显示的字体为Lucida(固定宽度),不要使用默认的字体。假如使用默认字体,我们会很难去区分PowerShell使用的一些特殊字符。可以参照下面的步骤来修改显示字体。

(1)右键单击控制台界面上侧边框(PowerShell字符位于控制台界面的左上方),选择目录中的属性。

(2)在弹出的会话框中,可以在几个标签页中修改字体、窗口颜色、窗口大小和位置等。

提示:

强烈建议窗口大小和屏幕缓冲器使用相同的宽度。

另外,需要注意的是,当应用对默认控制台的修改之后,后续所有新开的窗口都会使用变更之后的设置。

在前文中,我们已经多次提及MoreLunches.com网站,希望你有时间就去访问一下。这个网站上包含如下补充资料:

我们热衷于帮助像你这样的人来学习PowerShell,我们也在尽力提供各种不同的学习资源。同时,我们也很欢迎你给我们进行反馈,这样会促使我们找寻可以加入到我们网站的新资源,以及提升本书后续版本的质量。你可以通过MoreLunches.com网站联系到我们,也可以通过http://ITPro.ConcentratedTech.com或者在Twitter上@concentrateddon找到Don。

另外,也可以通过http://jdhitsolutions.com/blog博客或者在Twitter上@jeffhicks找到Jeffery。

“可以立即使用”是我们编写本书的一个主要目标。我们在每一章中尽可能仅关注某一部分的知识,并且你在学习之后,可以立即在生产环境中使用。这就意味着,在开始的时候,我们可能会避开一些细节的讨论,但是在必要时,我们承诺后续会回到这些问题并给出详细说明。在很多情形下,我们必须在首先给出20页的理论或者直接讲解并完成某些部分的学习(暂不解释分析其中的细微差别或者详细情况)中做出选择。当需要做出这类选择时,我们总是选择第二个,以便使得你可以立即使用起来。但是之前的那些细节,我们会在另外一个时间去进行分析讲解(针对那些不会影响本书内容的小细节,我们可能会在MoreLunches.com的在线文章中去进行讲解)。

好了,背景知识大概就介绍到这里。下面就开始第2章课程的学习。


本章将协助读者选择一种最适合的PowerShell界面(不错,你可以做出选择)。如果你曾经使用过PowerShell,可以直接跳过本章,但是你阅读依旧可以从本章中找到一些对你有帮助的信息。

微软提供了两种(如果你是很严谨的人,可以认为是四种)使用PowerShell的方式。图2.1显示了【开始】菜单中的【所有程序】界面,其中包含四种PowerShell图标。可以通过图中划线部分快速找到这些图标。

提示:

在旧版本的Windows中(本书环境基于Windows Server 2012),这些图标位于【开始】菜单中,可以通过依次选择【所有程序】>【附件】>【Windows PowerShell】来找到它们。除此之外,还可以在【开始】菜单中运行“PowerShell.exe”,然后单击【确认】, 打开PowerShell的控制台应用程序。在Windows 8和Windows Server 2012中,使用Windows键(通常位于Ctrl键和Alt键之间的Windows图标)加R打开运行对话窗口,或者单击Windows键,然后在输入框中输入PowerShell,即可快速打开PowerShell图标。

在32位操作系统中,最多只有两个PowerShell图标。在64位系统中,最多有4个。它们分别是:

图2.1 你可以选择四种PowerShell启动方式的其中一种

换句话说,32位操作系统仅有32位的PowerShell应用程序,而64位操作系统可以有32位和64位两个版本的PowerShell应用程序,其中32位应用程序在图标名中会包含“x86”字样。需要注意的是,有些扩展程序只支持32位环境,不支持64位。微软现在已经把全部精力放到64位系统中,而32位仅用于向后兼容。

提示:

在64位系统中,人们经常会错误地打开32位应用程序,此时应该注意窗体的标题,如果显示“x86”,证明你在运行32位程序。另外,64位扩展程序不能运行在32位应用程序中,所以建议用户把64位应用程序以快捷方式的形式固定在开始菜单中。

图2.2展示了PowerShell控制台窗口界面,这是大多数人第一次见到的PowerShell界面。

接下来从使用简单的PowerShell控制台命令和参数开始本小节。

图2.2 标准的PowerShell控制台窗口:PowerShell.exe

综上所述,PowerShell控制台应用程序将是你在没有安装GUI Shell的服务器上运行PowerShell的唯一选择(如一些“服务器核心功能”安装或者Windows Server中服务器GUI Shell功能被移除或没有安装的情景)。其优点是:

如果你打算使用控制台应用程序,在你配置时会有些建议可供参考。可以通过单击窗体左上角的图标,并选择【属性】来实现,如图2.3所示。

在【选项】标签页,可以调大“命令记录”的缓冲区大小。这个缓冲区可以记住你在控制台输入的命令,并且通过键盘的上、下键重新调用它们。你也可以通过按F7键来弹出命令列表。

在【字体】标签页,选择稍微大于默认12像素的字体。不管你是否拥有1.5的视力,稍微提高一下字体大小也没什么坏处。PowerShell希望你能在大量类似的字符中快速区分它们,比如’(撇号或单引号)和`(重音符)。如果使用小像素字体,识别这类字符将比较困难。

图2.3 配置控制台应用程序的属性

在【布局】标签页,把所有“宽度”设为相同的数值,并且确保结果窗体能适合你的显示屏。如果设置不合理,会导致PowerShell窗体下方出现水平滚动条。这可能导致一部分输出结果被挡住,从而忽略了它们的存在。作者的学生就曾经花了半小时来运行命令,但是却完全没有输出,实际上输出被隐藏在右边。

最后,在【颜色】标签页,强烈建议不要修改,保持高度反差将有助于阅读。如果你不喜欢默认的蓝底白字,可以考虑中灰底黑字的形式。

需要记住一件事:这个控制台应用程序并不是真正的PowerShell,仅仅是你和PowerShell交互的界面。控制台应用程序本身可以追溯到大约1985年,所以你不要指望能从中得到流畅的体验。

图2.4展示了PowerShell 集成脚本环境,也称ISE。

提示:

如果你不经意打开了普通的控制台应用程序,可以输入“ise”并按回车键,从而打开ISE。

图2.4 PowerShell ISE(PowerShell_ISE.exe)

表2.1 ISE的优缺点

优点 缺点
ISE界面友好且支持双字节字符集 ISE要求Windows Presentation Foundation(WPF),意味着不能在没有安装GUI的服务器上运行ISE
在后续章节可以看到ISE能在你创建PowerShell命令和脚本时提供更多的帮助 启动和运行需要较长时间,但是这通常只是几秒的差异
ISE使用常规的复制、粘贴按键 ISE不支持转录

表2.1列出了ISE的优缺点,从中可以得到大量背景信息。

下面从一些基本定位开始。图2.5展示了ISE的三个主要区域,图中划线部分即为ISE的工具栏。

在图2.5中,最上方的区域是【脚本编辑窗格】,直到本书最后才会用到。在它的右上角,可以看到一个蓝色的小箭头,单击它可以最小化【脚本编辑窗格】并最大化【控制台窗格】。控制台窗口是我们将要使用的地方。右边是【命令管理器】,可以通过它最右上方的“X”打开或者关闭这个窗口。除此之外,可以通过工具栏倒数第二个按钮来浮动【命令管理器】。如果你已经关闭【命令管理器】又想让它重新出现,可以单击工具栏的最后一个按钮。工具栏中的前三个按钮用于控制【脚本编辑器】和【控制台窗格】的布局。可以通过这些按钮把窗体设置为【在顶部显示脚本窗格】、【在右侧显示脚本窗格】和【最大化显示脚本窗格】。

在ISE窗口的右下角,可以发现用于改变字体大小的滚动条。在【工具】菜单中,可以找到一个【选项】项用于配置定制化的颜色方案和其他显示配置——这完全根据你的喜好而定。

图2.5 ISE的三个主要区域及控制它们的工具栏

动手实验:首先我们假设读者将会在余下章节中只使用ISE,然后隐藏【脚本编辑窗格】。如果你愿意,也可以把【命令管理器】隐藏。把字体大小设置到你喜欢的样子。如果你不能接受默认的颜色方案,请自行选择。如果你更喜欢控制台应用程序,请放心使用,本书的绝大部分内容同样能在控制台中运作。一些仅在ISE中才能使用的功能将会额外标注。

PowerShell是一个命令行接口,意味着你需要大量输入代码。然而输入命令就意味着可能出现错误,例如拼写错误。幸运的是,所有PowerShell应用程序都提供了最小化错别字的方式。

动手实验:接下来的例子在本书中可能显得不太实际,但是在本节看来却很炫。读者可以在自己的环境中尝试一下。

控制台应用程序支持四种“Tab键补全”。

PowerShell ISE提供了类似功能,甚至可以说比“Tab补全”功能更好的功能——智能提示。这个功能在前面四个情况下都能运作。图2.6演示了如何通过弹出菜单来实现你在使用“Tab”键时完成的功能。可以使用上下箭头按钮来滚动菜单,找到你想要的选项,然后按“Tab”或者按“Enter”键来选择,再继续输入剩余代码。

智能提示可以工作在ISE的控制台窗格和脚本编辑窗格中。

警告:

当你在PowerShell中输入时,请极其小心。在某些情况下,一个错位的空格、引号或者单引号都会带来错误或者失败。如果出现了错误,请再三检查你的输入内容。

图2.6 在ISE中类似Tab自动补全功能的智能提示功能

接下来让我们快速回顾一些会影响你享受PowerShell旅途的绊脚石。

在很大程度上,找出当前使用的PowerShell版本不是件容易的事,因为每个发布版本都安装在“1.0”的目录下面(1.0是引用的Shell引擎语言版本,即所有版本都向后兼容到v1)。针对PowerShell,有一种简单的方式检查:

PS C:\> $PSVersionTable 
Name                 Value 
----                 ---- 
PSVersion              3.0 
WSManStackVersion         3.0 
SerializationVersion        1.1.0.1 
CLRVersion             4.0.30319.17379 
BuildVersion             6.2.8250.0 
PSCompatibleVersions        {1.0, 2.0, 3.0} 
PSRemotingProtocolVersion     2.2  

输入$PSVersionTable,然后按“Enter”键。可以看到每个PowerShell相关技术的版本号,包括PowerShell自身的版本号。如果命令不能运行,或者显示最少需要PSVersion 3.0等字样,则需要使用第1章中展示的方式安装最少3.0的版本。

动手实验:现在就开始使用PowerShell,首先检查你的PowerShell版本是否达到最少3.0版本,如果不是,请先升级到最少3.0版本。

因为这是本书第一个实验,所以我们会花一些时间去描述它们是如何运作的。对于后续的每个实验,我们会给出一些任务,以便你可以自己动手尝试和完成。一般我们只给出一些提示或者方向指引。所以从现在开始,你只能靠自己了。

我们保证所有需要用于完成实验的知识仅限于当前章节或之前的章节(对于之前章节的知识,我们一般采用提示的方式给出)。我们不会把答案说得太明显,更多地,当前章节会告诉你如何发现你所需要的信息,你需要自己去发现这些问题的答案。虽然看起来有点让人沮丧,但强迫自己去完成,从长远来说绝对可以让你在PowerShell的世界里面走得更好。

顺带提醒,你可以在MoreLunches.com中找到一些示例答案。这些答案不一定完全匹配你的问题,但是当我们一步一步地深入之后,答案将变得越来越准确。实际上,我们会发现PowerShell针对几乎所有的问题都能提供几种甚至更多的方式实现。我们会尽可能地使用最常用的方式,但是如果你尝试使用另外一些不同的方式,并不代表你是错误的。任何能实现结果的方式都是正确的。

注意:

本实验需要PowerShell v3或以上版本。

我们从简单的例子开始:希望你能从控制台和ISE的配置中实现相同的结果。然后按照下面五步进行。

1.选择适合你自己的字体和颜色。

2.确保控制台应用程序下方没有水平滚动条。(本章中已经第三次提到,可见其重要性。)

3.在ISE中,最大化控制台窗格,移除或最小化命令管理器。

4.在所有应用程序中,输入一个单引号“'”和一个重音符“`”,确保你可以轻易识别出来。在美式键盘中,重音符位于左上角,在“Esc”键下面,和波浪号“~”位于同一个键中。

5.同样输入括号(),中括号[],尖括号<>和花括号{},确保你所选择的字体和大小能很好地展示这些符号,足以让你马上识别出来。否则,请选择其他字体或者加大字体大小。

前面已经提到过这些步骤,所以你对此应该没有任何疑问,你要做的只是一步一步地完成。

除了微软提供PowerShell之外,你会发现其他针对PowerShell定制的免费或商用的编辑工具。下面提供常见的几种。你可以去试用。就算商业版也会有试用期,所以不妨去尝试一下。

你可能找到其他工具,但是这四种工具的用户群是最多的,而且是我们最常用的工具。我们和这些公司没有任何关系(仅仅是欣赏他们的成果)。经常有人问,这些软件里面哪个用得最多。此时我们只能说使用ISE最多,因为我们经常重建虚拟机,并且懒得重新安装这些编辑器(而且我们也没有时间去为此专门写一个PowerShell脚本)。即便如此,当我们的确要确定使用一个第三方工具时,通常是PowerShell Plus,因为我们喜欢它提供的增强版控制台而不仅仅是脚本编辑器。对于这种集成,我们深表欢迎。但是还是建议读者根据需要和预算选择这些工具。

2012年1月,Don评论了各种各样的PowerShell环境。假如你在2014年1月开始阅读本书(此时文章可能过时,并且根据当前可用产品而更新),可以从下面链接中查看:http://ConcentratedTech.com。它成文于PowerShell v3时代,并且适用于文章中提到的产品。不管怎样,它还是可以作为学习Shell脚本的不错的起点。


在这本书的第1章,我们提到由于图形用户界面具有更强的可发现性,所以更容易学习和使用。但对于像PowerShell这样的命令行接口-CLIs(command-line interfaces)的学习却往往要困难一些,因为它们缺乏可发现性这个特性。事实上,PowerShell拥有出色的可发现性,但是它们并不是那么明显。其中一个主要的可发现性的功能是它的帮助系统。

请忍受1分钟的时间让我们走上讲台给你讲述下面的内容。

我们工作在一个不是特别重视阅读的行业,但是我们有一个缩写RTFM(Read The Friendly Manual)。当我们希望他们可以“阅读易于使用的手册”时,就能巧妙地把命令传递给用户。大多数管理员更加倾向于直接上手、依赖于GUI工具的提示、上下文菜单等这些GUI的可发现性工具来领会如何操作。这也是我们工作的方式。我们假设你也是以同样的方式进行工作的。但是我们来认清一件事情:

如果你不愿意花时间去阅读PowerShell的帮助文档,那么你就无法高效使用PowerShell,也很难进一步学习如何使用它,更不用说使用它管理类似Windows或Exchange等产品,最终你无法摆脱使用GUI的方式。

让我们澄清一下,虽然上面一段看上去很蠢,但绝对是真理。想象一下,当你使用活动目录和计算机或是其他管理控制台时没有帮助提示、菜单、上下文菜单会怎么样。好比学习PowerShell而不去花时间去学习帮助文件也是如此。这就好像你去宜家不阅读手册就去组装家具,那么你必然会经历挫折、困惑以及感到无能为力。为什么呢?

我们意识到我们的讲述过于强调帮助的重要性,但我们看到学生在课堂上或者在工作中面临的问题:如果他们能腾出几分钟坐下来、深呼吸和阅读帮助,90%的问题都能得到解决。阅读这一章,将帮助大家理解正在阅读的帮助文档。

从现在开始,我们来介绍几个鼓励你阅读帮助文档的原因。

我们向你保证,掌握帮助系统是成为PowerShell专家的一个关键。但你不会在帮助文档中找到每一个细节。很多高级资料并没有记录在帮助系统,但为了有效的日常管理,你需要熟练运用帮助系统。本书会帮助你深入理解该系统,并和内置帮助结合使用,可以教会你在帮助文档中没有具体解释的部分。

是时候走下讲台了。

Command对比Cmdlet

PowerShell 包含了很多不同类型的可执行命令,有些叫作Cmdlet,有些叫作函数,还有一些被称为工作流,等等。它们的共同点都是命令,帮助系统中都对它们进行了展示。每个Cmdlet在PowerShell中都是唯一的,你运行的大多数命令都属于Cmdlet。但在谈论一般类的可执行程序的时候,我们会使用“命令”来表示,从而保证一致性。

当你第一次使用帮助时,你也许会很惊讶,因为里面什么都没有。不要着急,我们会为你讲解。

微软在PowerShell v3中加入了一个新的特性,叫作“可更新的帮助”。PowerShell可以通过互联网进行下载更新、修正和扩展。

不过,为了做到可更新,微软不能把任何帮助放到安装包中。当你需要查看一个命令的帮助时,你可以得到一个自动生成的简易版的帮助,还可以通过这些信息来提示你怎么更新帮助文档,类似下面的信息。

PS C:\> help Get-Service

NAME
  Get-Service 

SYNTAX
  Get-Service [[-Name] <string[]>] [-ComputerName <string[]>] 
  [-DependentServices] [-RequiredServices] [-Include <string[]>] 
  [-Exclude <string[]>] [<CommonParameters>] 

  Get-Service -DisplayName <string[]> [-ComputerName <string[]>] 
  [-DependentServices] [-RequiredServices] [-Include <string[]>] 
  [-Exclude <string[]>] [<CommonParameters>] 

  Get-Service [-ComputerName <string[]>] [-DependentServices] 
  [-RequiredServices] [-Include <string[]>] [-Exclude <string[]>] 
  [-InputObject <ServiceController[]>] [<CommonParameters>] 

别名
  gsv 

备注
  Get-Help 在本机无法找到关于这个Cmdlet命令对应的帮助文档。
  这只显示了部分帮助信息。
    -- 可使用Update-Help下载和安装包含这个Cmdlet模板的帮助文档。
    -- 可输入"Get-Help Get-Service -Online"命令或者
  输入网址http://go.microsoft.com/fwlink/?LinkID=113332 
    查看关于帮助主题的在线文档。

提示:

如果你的本机没有安装帮助,在你第一次使用帮助的时候,PowerShell 会提示你更新帮助系统。

更新PowerShell的帮助文档应该是你的首要任务。这些文件存储在System32这个目录下,这意味着你的Shell必须在更高特权下运行。如果在PowerShell 的标题中没有出现“管理员”的字眼,你将会得到一个错误信息:

PS C:\> update-help 
Update-Help : 无法更新以下模块的帮助: 
'Microsoft.PowerShell.Management, Microsoft.PowerShell.Utility, 
Microsoft.PowerShell.Diagnostics, Microsoft.PowerShell.Core, 
Microsoft.PowerShell.Host, Microsoft.PowerShell.Security, 
Microsoft.WSMan.Management' : 
命令无法更新 Windows PowerShell 核心模块或 $pshome\Modules 目录中任意模块的帮助主题。若要更新这些帮助主题,请使用“以管理员身份运行”命令启动Windows PowerShell,然后重试运行 Update-Help。
所在位置 行:1 字符: 1 
+ update-help 
+ ~~~~~~~~~~~ 
   + CategoryInfo      : InvalidOperation: (:) [Update-Help], Except 
  ion 
   + FullyQualifiedErrorId : UpdatableHelpSystemRequiresElevation,Micros 
  oft.PowerShell.Commands.UpdateHelpCommand 

前面错误信息中以粗体进行标识的部分,告诉你问题的所在并告诉你如何解决它。以管理员身份来运行Shell,再次运行Update-Help命令,这样它就可以运行了。运行需要花费几分钟的时间。

每隔一个月左右的时间重新获取帮助是一个很重要的习惯。PowerShell 甚至可以下载微软之外的命令帮助文档,只要这些命令模块在合适的位置进行本地化之后加入到在线上以供下载。

假如你的计算机不能连上互联网,那该怎么办呢?不要担心,首先找到一台可以上网的机器,并使用Save-Help命令把帮助文档下载一份到本地。然后把它放到一个文件服务器或者其他你可以访问的网络中。接着通过在Update-Help加上-SourcePath参数指向刚刚下载的那份帮助文档的地址。这可以让局域网内任何计算机从中心服务器获取更新后的帮助,代替从互联网获取。

Windows的PowerShell 提供了Get-Help这个Cmdlet命令来访问帮助系统。你可能看到很多示例(特别是在互联网)都是使用“Help”或“Man”这个关键字来代替Get-Help。Man和Help根本都不是原始的Cmdlet命令,而是对核心Cmdlet命令进行包装的函数。

Help的工作原理跟Get-Help是一样的,但它可以把输出的信息通过管道传送给More命令。这样你就可以以分屏这样友好的方式来查看帮助的内容,而不是一次性打印出所有的帮助信息。运行Help Get-Content和 Get-Help Get-Content,将会返回相同的结果。前者是一次一页显示,你也可以使用Get-Help Get-Content | More分页显示,但这需要输入更多的字符,我们使用Help就能完成输入了。我们讲了这么多的目的是想让你知道隐藏在下面真实的东西。

注意:

从技术上来说,Help属于一个函数,而Man属于Help的一个别名,或者叫昵称。但是它们返回的结果都是一样的。我们将会在下一章讨论别名。

顺便提醒一下,有些时候你可能会讨厌分页显示,因为你想一次性获取所有的信息,但是它却一次次让你输入空格键来显示剩下的信息。如果你遇到这样的情况,在Shell控制台窗口按Ctrl+C组合键来取消命令并立即返回到Shell。Ctrl+C组合键总是表示“返回”的意思,而不是“拷贝到剪切板”的意思。而在图形化Windows PowerShell ISE中,Ctrl+C表示拷贝到剪切板。工具栏中有一个红色按钮“停止”,它可以用于停止正在运行的命令。

注意:

很多命令在图形化的ISE中不起作用,甚至当你使用Help或Man时,它会一次性返回所有的帮助信息,而不是一次返回一页。

帮助系统有两个主要的目标:一个是帮助你找到特定任务的命令,另一个就是帮助你学会使用找到的这些命令。

从技术上来说,帮助系统不知道Shell中存在哪些命令。它只知道有哪些可用的帮助主题。某些命令可能并没有帮助文档,这会导致帮助系统不能确认这个命令是否存在。幸好微软几乎每个发布的Cmdlet都包含一个帮助主题,这意味着你通常不会发现不同。另外,帮助系统也包含了除特定Cmdlet之外的其他信息,包括背景概念和其他基础信息。

跟大多数命令一样,Get-Help(等同于Help)有几个参数。其中一个最为重要的参数是-Name。这个参数指定你想要访问帮助的主题名称,并且它是一个定位参数,所以你不用必须输入-Name,可以只提供需要查看命令的名称。它也支持通配符,这让帮助系统更加容易找到命令。

例如,你想操作系统事件日志,但是你却不知道使用什么命令,你决定搜索帮助主题包含的事件日志,可以运行下面两个命令中的任何一个。

Help *log* 
Help *event* 

第一个命令在你的计算机返回如下列表:

Name               Category     Module
----               --------     ------  Clear-EventLog         Cmdlet      Microsoft.PowerShell.M... Get-EventLog           Cmdlet       Microsoft.PowerShell.M... Limit-EventLog          Cmdlet       Microsoft.PowerShell.M... New-EventLog           Cmdlet      Microsoft.PowerShell.M... Remove-EventLog         Cmdlet      Microsoft.PowerShell.M... Show-EventLog          Cmdlet       Microsoft.PowerShell.M... Write-EventLog        Cmdlet       Microsoft.PowerShell.M... Get-AppxLog           Function     Appx Get-DtcLog            Function     MsDtc Reset-DtcLog           Function     MsDtc Set-DtcLog            Function     MsDtc Get-LogProperties        Function     PSDiagnostics Set-LogProperties        Function     PSDiagnostics about_Eventlogs         HelpFile about_Logical_Operators    HelpFile

注意:

你可以注意到,前面的这个列表的Appx、MsDtc模块包含命令(和函数)等。即使你还没有加载这些模块扩展到内存,帮助系统也一样会显示所有模块。这可以帮助你发现电脑上被遗漏的命令。它可以发现那些安装在适当位置所有扩展中的命令。对此,我们会在第7章进行讨论。

前面的列表中有许多关于事件日志的函数,它们都基于“动词-名词”这个命名格式,但是最后出现了两个关于帮助主题的特殊Cmdlets命令。这两个“about”主题提供了关于某个命令的背景信息。最后一个看起来跟事件日志没有什么关系,但是它被搜索到是因为其中有一个单词“logical”的其中一部分包含了“log”。只要有可能,我们尽量使用“*event*”或者“*log*”来搜索,而不是使用“*eventlog*”,因为我们可以返回尽可能多的结果。

一旦发现从名称看起来可能是你所需的Cmdlet时(比如说,后面示例中Get-EventLog看起来就是做这件事的),你就可以查看该Cmdlet的帮助文档进行确认。

Help Get-EventLog 

不要忘记使用Tab键来补全命令!它可以让你只输入部分命令名,按下Tab键,接着Shell会完成与你刚刚输入最为接近匹配的命令。你可以连续按Tab键来选择其他匹配的命令。

动手实验:输入Help Get-Ev,接着按下Tab键。第一次匹配到的是Get-Event,这并不是你想要的;再次按下Tab键就匹配到Get-EventLog,这就是你想要的命令。你可以敲回车键来确认这个命令并显示这个命令对应的帮助信息。如果你使用ISE,你不需要敲Tab键。所有匹配的命令都会以列表的形式呈现,你可以选择其中一个并敲回车键,这样就完成了命令的输入。

你也可以使用最为重要的“*”通配符,它可以在Help后面占用零个或多个字符。如果PowerShell只找到一个匹配你输入的命令,它并不是以列表的形式返回这个单一项,而是直接显示这一单项的具体帮助内容。

动手实验:运行Help Get-EventL*命令,你应该可以看到关于Get-EventLog的帮助信息,而不是返回一个匹配的帮助主题列表。

如果你一直跟随本书的示例进行实验,那么现在你就应该在看Get-Eventlog的帮助文档了。这个文档被称为概要帮助,这意味着它只有简单的命令描述和语法提示。这些信息是非常有用的,当你需要快速认识一个命令的使用,并且我们通过这个帮助文档来进行示例讲解。

补充说明

有些时候,我们想分享的信息虽然不错,但不是至关重要的Shell知识。我们将把这些信息放到“超越自我”部分,正如现在这个部分。如果你跳过这段,你并没有什么损失,但是如果你阅读了,你通常会学会以另外一种方式来解决问题,或者得到额外深入理解PowerShell的机会。

我们前面提到过Help命令并不是为了搜索Cmdlet命令,而是为了搜索帮助主题。因为每个Cmdlet都有一个帮助文件,我们可以说,这些搜索是检索相同的结果集。但是你也可以直接使用Get-Command命令来搜索Cmdlet命令(或者它的别名Gcm)。

跟Help这个命令一样,Get-Command接受通配符,意味着你可以运行Gcm *event* 来查看所有名称包含“event”的命令。不管怎么样,这个返回的列表将包含不止Cmdlet命令,还会包含一些不一定有用的外部命令,如netevent.dll。

一个比较好的方式是使用“-名词”或者“-动词”参数。因为只有Cmdlet名的名称有名词和动词,返回的结果将会限制为Cmdlet命令。Get-Command -noun *event*将会返回一个关于事件命令的列表;Get-Command -verb Get将会返回一个具有检索能力的列表。你也可以使用-CommandType参数来指定命令的类型。比如,Get-Command *log* -type Cmdlet将会返回一个所有命令名称包含“log”的命令列表,并且这个列表不会包括任何其他扩展应用程序或者扩展命令。

PowerShell的Cmdlet帮助文件有一些特殊的约定。从这些帮助文件中提取大量信息的关键是你需要明白自己在寻找的是什么,并学会更高效地使用这些Cmdlet命令。

大部分命令可以有很多不同的使用方式,这依赖于你需要用它们来干什么。例如,下面是Get-EventLog的语法帮助部分。

SYNTAX 
  Get-EventLog [-AsString] [-ComputerName <string[]>] [-List][<CommonParameters>] 

  Get-EventLog [-LogName] <string> [[-InstanceId] <Int64[]>] [-After <DateTime>] 
  [-AsBaseObject]   [-Before <DateTime>] [-ComputerName<string[]>] [-EntryType 
  <string[]>] [-Index <Int32[]>]   [-Message<string>] [-Newest <int>] [-Source 
  <string[]>] [-UserName <string[]>]   [<CommonParameters>] 

注意,这个命令在语法部分出现了两次,这表示这个命令提供了两个不同的参数集,你可以有两种方式来使用这个命令。你可能已经注意到,有些参数是这两个参数集共享的。例如,这两个参数集都包含-ComputerName参数。但是这两个参数集总是会有些差异。在这个实例中,第一个参数集提供了-AsString和-List,这两个参数都没有出现在第二个参数集中;而第二个参数集包含许多第一个参数集中没有的参数。

下面来说明它们是如何工作的:如果你使用一个只包含在某个参数集中的参数,那么你就只能使用同一个参数集里的其他参数。如果你选择使用-List参数,那么你能使用的其他参数就只能是-AsString和-ComputerName,因为存在-List的参数集中只剩这两个参数可以选择了。你不能添加-LogName参数,因为它不存在于第一个参数集中。这意味着-List和-LogName是相互排斥的,即你不能同时使用它们,因为它们存在于不同的参数集中。

有些时候,可以只运行命令参数集中共同的参数部分。在这种情况下,Shell通常会选择第一个参数集。明白你运行的命令属于哪个参数集是非常重要的,因为每个参数集意味着不同的功能。

你可能已经注意到,在每个PowerShell的Cmdlet参数的结尾都有[<CommonParameters>]。不管你以何种方式使用Cmdlet,这泛指每个Cmdlet命令都是使用的一组包含8个参数的集合。现在暂时不讨论通用参数,我们会在本书后面章节真正使用它们的时候来讨论。不过,在本章后面,如果你有兴趣,我们会告诉你哪里可以学习到更多关于通用参数的知识。

谨记:如果你访问http://MoreLunches.com,并在首页搜索这本书(译者注:本书的英文名),你会获得各种免费配套材料。这些材料包含主要概念的示例视频,如参数和参数集,这可以帮助你更加容易理解它们。

运行一个Cmdlet命令,你不需要提供全部参数。PowerShell的帮助文档把可选参数放到一个方括号中。例如,[-ComputerName <string[]>]表示整个-ComputerName参数是可选的。你可以根本不使用它,因为在没有为这个参数指定一个具体值的时候,Cmdlet会默认为本地计算机。这也就是为什么[<CommonParameters>]在方括号内,你就可以在不使用任何通用参数的情况下运行这个命令。

几乎所有的Cmdlet命令都最少有一个可选参数。你可能永远不会需要使用其中的一些参数,你或许只需要使用其他日常参数。记住,当你选择一个参数时,你只需输入足够的参数名称就可以让PowerShell明确找出参数的意思。例如,-L不能充分表示-List,因为-L可以表示-LogName。但是-Li会是-List的一个合适的缩写,因为其他参数没有以-Li开头的。

如果你在运行命令但忘了指定必选参数,会发生什么事情呢?来看看Get-EventLog的帮助。例如,你可以看到-LogName参数是具有强制性的,这个参数不是以方括号结束的。尝试在没有指定日志名称的情况下运行Get-EventLog。

动手实验:通过运行没有任何参数的Get-EventLog命令来查看这个例子。

PowerShell会提示你需要强制输入LogName参数。如果你输入类似System或者Application的参数值之后敲回车键,这个命令就能正常运行了。你可以按下Ctrl-C组合键来终止这个命令。

PowerShell设计师知道有些参数会被频繁地使用,而你不希望不断地输入参数名。通常来说,参数是具有位置性的。这意味着只要你把参数值放在正确的位置,你就可以只提供这个参数值,而不需要输入具体的参数名。

有两种方式可以用来确定定位参数:通过语法概要或者通过详细的帮助文档。

在语法概要中找到定位参数

你可以在语法概要中找到第一种方式:只有参数名被方括号括起来的参数。比如,查看Get-EventLog的第二个参数集的前两个参数:

[-LogName] <string> [[-InstanceId] <Int64[]>] 

第一个参数:-LogName。它是必选的。我们可以识别出它是必选参数,是因为它的参数名和参数值不在一个方括号里面。但是它的参数名处在一个方括号内,这让它成了一个定位参数,所以我们可以只提供日志名称而不需要输入参数名-LogName。并且因为这个参数出现在帮助文档的第一个位置,所以我们知道这个日志名称是我们必须提供的第一个参数。

第二个参数:-InstanceId。它是可选的,因为它的参数名和参数值放在同一个方括号内。在方括号内,-InstanceId本身又处在一个方括号里,意味着它同时还是一个定位参数。它出现在第二个位置,所以我们省略这个参数名,就必须在这个位置提供一个参数值。

参数-Before(出现在语法的后面,通过运行Help Get-EventLog命令自行查找)是一个可选参数,因为参数名和参数值同在一个方括号里面。-Before参数名没有单独放在方括号里,这告诉我们,当选择使用这个参数时,必须输入这个参数名(或者最少是它的别名)。

使用定位参数时的几个技巧。

我们将提供一个最佳实践:一直使用参数名,直到你能顺手地使用每个Cmdlet并厌倦了一遍一遍输入常用的参数。在此之后,使用定位参数来节省时间。当需要把一个命令以文件的形式存储在文本文件以方便重用时,通常使用完整的Cmdlet名和完整的参数名。这样做的目的是将来可以方便阅读和理解,因为你不需要重复输入参数名(这毕竟也是你把命令存储在一个文件的目的),这不会增加你太多额外的输入。

在详细的帮助文档中找到定位参数

我们说通常有两种方式来定位参数。第二种方式需要你使用Help命令指定-full参数来打开帮助文档。

动手实验:运行Help Get-EventLog -full命令。记得使用空格一页一页查看帮助文档,如果你想停止查看,可以使用Ctrl-C组合键到达帮助文件的末尾。现在,可以通过滚动窗口重复查看整个页面。

一页一页查看,直到你看到类似下面关于-LogName参数的信息。

-LogName <string>
    指定事件日志。输入一个事件日志的日志名称(Log 属性的值;而非 LogDisplayName)。
    不允许使用通配符。此参数是必需的。

    是否必需?          True 
    位置?            1 
    默认值                
    是否接受管道输入?      False 
    是否接受通配符?       False 

在前面的例子中,你可以看到这是一个强制参数,并且它是一个定位参数,同时,它出现在Cmdlet命令之后的第一个位置。

当学生开始使用一个Cmdlet命令的时候,我们总是鼓励他们把焦点放在阅读帮助上,而不只是缩写语法的提示上。阅读帮助可以让我们理解得更加详细,包含参数的使用描述。你可以看到这个参数不接受通配符,这意味着你不能提供类似App*的参数值,你需要输入日志名的全称,如Application。

帮助文档同样给你提供了每个参数的数据类型。有些参数被称为开关参数,无需任何输入值。在缩写语法中,它们看起来如下所示。

[-AsString] 

在详细语法中,它们看起来如下所示。

-AsString [<SwitchParameter>] 
  以字符串而非对象的形式返回输出。 
  是否必需?          False 
  位置?            named 
  默认值                
  是否接受管道输入?      False 
  是否接受通配符?       False 

通过[<SwitchParameter>]可以确认这是一个开关参数,并不需要任何输入值。开关参数的位置可以随意放置,你必须输入参数名(或者至少是一个缩写)。开关参数总是可选的,这可以让你选择是否使用它们。

其他参数希望获得的数据类型,通常会跟在参数名之后,并使用空格与参数名分开(不是冒号、等号或者其他字符)。在概要语法里面,输入的类型使用尖括号来表明,例如< >:

[-LogName] <string> 

在详细语法中以相同的方式显示:

-Message <string> 

  获取其消息中具有指定字符串的事件。可以使用此属性来搜索包含特定单词或短语的消息。允许使用通配符。
  是否必需?           False 
  位置?              named 
  默认值                
  是否接受管道输入?        False 
  是否接受通配符?        True 

下面来看看通常的输入类型。

关于更多类型,我们将在遇到的时候再做讨论。

你也许注意到有些值包含多个方括号:

[-ComputerName <string[]>] 

string后面的方括号并不意味着某些东西是可选的。事实上,string[]意味着这个参数可以接受数组、集合,或者是一个列表类型的字符串。在这种情况下,只提供一个值也是符合语法的。

Get-EventLog Security -computer Server-R2 

但是指定多个值也是符合语法的。一个简单的方式是提供一个以逗号为分隔符的列表。PowerShell把以逗号为分隔符的列表作为数组值来对待。

Get-EventLog Security -computer Server-R2,DC4,Files02 

再次说明,任何一个单一值中如果包含了空格,就必须使用引号。但是作为一个整体的列表,是不需要使用引号的,只有单一值才需要使用引号。这一点非常重要。下面的命令是符合语法的。

Get-EventLog Security -computer 'Server-R2','Files02' 

即使这些值没有一个需要引号,但如果你想,加上也没问题。但是下面将会出错:

Get-EventLog Security -computer 'Server-R2,Files01' 

在这个示例中,Cmdlet命令会查找一个名为Server-R2,Files01的计算机。这也许不是你想要的。

另外一种提供列表值的方式是把它们输入到一个文本文件中,每一个值一行。例如:

Server-R2 
Files02 
Files03 
DC04 
DC03 

接着,你可以使用Get-Content这个Cmdlet来读取这个文件的内容,并且发送这些内容到-computerName参数中。你可以强制Shell先执行Get-Content命令,这样就可以把结果送到这个参数了。

记得高中数学中像()的括号可以用来在数学表达式中指定操作的顺序。这同样适用于PowerShell。使用圆括号把命令括起来,就强制这些命令先执行。

Get-EventLog Application -computer (Get-Content names.txt)

前面一个示例展示了一个有用的技巧:我们可以把Web服务器、域名控制器和数据库服务器等不同类型的服务器放到一个文本文件中,接着使用这个技巧再次运行这个包含全部计算机集合的命令。

你也可以使用其他方式来输入一个列表值,包含从活动目录中读取计算机名称。这些技术会更加复杂。在学习一些Cmdlet命令之后,便能玩转这些技巧。我们会在后面的章节学习到。

另一种为参数(假设它是一个强制参数)指定多个值的方式是不指定参数。与所有强制参数一样,PowerShell将提示你输入参数值。对于接受多个值的参数,你可以输入第一个值并按回车键,继续输入直到完成,最后空白处按回车键,这将告诉PowerShell你已经完成输入了。像通常一样,如果你不想被提示输入项,可以按Ctrl+C组合键来终止命令。

我们倾向于通过示例来学习,这就是在本书放置大量示例的原因。PowerShell的设计者知道大部分管理员都喜欢示例,这也是他们把大量的示例放置到帮助文档的原因。如果你滚动到Get-EventLog帮助文档的末尾,几乎可以发现一打使用这个Cmdlet命令的例子。

如果你只想看到示例,我们有一个简单获取到这些示例的方法:在Help命令中加入-example参数,而不是使用-full参数。

Help Get-EventLog -example 

动手实验:使用这个新的参数来获取一个Cmdlet 命令的示例。

我们喜欢这些示例,尽管它们有些会比较复杂。如果遇到一个对你来说太复杂的示例,请忽略它,并测试其他示例。或者通过一点点的尝试(必须在非生产机器上测试),看你是否知道这个示例是用来干什么的,为什么要这样用。

在本章的前面部分,我们提到PowerShell的帮助系统包含许多背景主题,可以用来帮助定位指定的Cmdlet命令。这些背景主题通常被称为“关于”主题,因为它们都是以“about_”开头的。你可能还记得在本章的前面,所有的Cmdlet命令都提供一个通用参数集。怎样才可以了解更多关于这些常见的参数?

动手实验:在你继续读本书之前,确认你是否可以通过帮助系统列出公用参数。

我们将先使用通配符。因为“common”在本书已经被多次使用,所以先从下面的关键字开始。

Help *common* 

这真是一个好的关键字。事实上,这只会在帮助主题中匹配到一条记录:About_common _parameters。这个主题将会自动显示,因为只有唯一一条配置的主题。浏览显示的帮助主题,你会发现如下8个通用参数。

-Verbose
-Debug
-WarningAction 
-WarningVariable 
-ErrorAction 
-ErrorVariable
-OutVariable 
-OutBuffer 

这个帮助文档提到两个额外的“风险缓解”参数,但是并不是每个Cmdlet命令都提供这两个参数。

在帮助系统中,“关于”这个主题是非常重要的。但是,因为它们没有关联到某个特定的Cmdlet命令,所以很容易被人忽略。如果你运行help about*列出所有信息,你也许会吃惊怎么有那么多额外的文档信息隐藏在Shell里面。

表3.1列出了几个第三方脚本和应用程序,可以使PowerShell的帮助更容易访问。

表3.1 PowerShell帮助的第三方脚本和应用程序

资源

URL

一个关于能以图形方式来浏览列出所有可用帮助主题的PowerShell脚本

http://mng.bz/5w8E

一个专用于列出所有可用帮助主题的Widnows应用程序

http://www.sapien.com/downloads 登录(可以免费注册)并搜索关键字“Free Tools”

一个可以下载的Windows帮助文档,包含帮助(当然也包括“关于”主题)和PowerShell

http://download.microsoft.com (使用搜索)

PowerShell的帮助文档是由人编写的,这意味着它们并一定准确无误。除了更新帮助文档(你可以运行Update-Help),微软也在其网站上发布帮助文档。PowerShell help命令的-online参数,使用它可以在网络中找到你所想要命令的帮助信息:

Help Get-EventLog -online

微软的TechNet 站点解析这个帮助,并且它通常比安装PowerShell中帮助文档要更新。如果你认为在示例或者语法中发现了一个错误,那就尝试查看在线版本的帮助文档吧。不是所有的Cmdlet全集都包含于PowerShell在线文档,而是由各个产品团队负责(如Exchange团队、SQLServer团队、SharePoint团队等)共同提供帮助文档的更新。但PowerShell在线文档在可用的情况下,会是个不错的文档手册。

我们喜欢在线帮助文档,是因为当我们在PowerShell输入脚本的时候,可以在另一个窗口上阅读文档(帮助文档在Web浏览器也能有良好的格式)。Don通过一个简单的设置就可以使用双屏显示,效果更佳。

 

注意:

在本实验中,你需要在计算机中运行PowerShell v3或更高版本。我们希望这一章已经传达了掌握PowerShell的帮助系统的重要性。现在是时候通过完成以下任务来磨练你的技能。记住,例子的答案可以在MoreLunches.com上找到。查看这些任务中的斜体字,并使用它们作为线索来完成这一任务。

1.运行Update-Help并确保它执行无误。这会让你的本机下载一份帮助文档。条件是你的电脑能连上互联网,并且需要在更高特权下运行Shell(这意味着必须在PowerShell的标题中出现“管理员”的字眼)。

2.哪一个Cmdlet命令能够把其他Cmdlet命令输出的内容转换到HTML

3.哪一个Cmdlet命令可以重定向输出到一个文件(file)或者到打印机(printer)?

4.哪一个Cmdlet命令可以操作进程(processes)?(提示:记住,所有Cmdlet命令包含一个名词。)

5.你可以用哪一个Cmdlet命令向事务日志(log)写入(write)数据?

6.你必须知道别名是Cmdlet命令的昵称。哪一个Cmdlet可以用于创建、修改或者导入别名(aliases)?

7.怎么保证你在Shell中的输入都在一个脚本(transcript)中,怎么保存这个脚本到一个文本文件中?

8.从安全事件(event)日志检索所有的条目可能需要很长时间,你怎么只获取最近的100条记录呢?

9.是否有办法可以获取一个远程计算机上安装的服务(services)列表?

10.是否有办法可以看到一个远程计算机运行了什么进程(processes)?

11.尝试查看Out-File这个Cmdlet命令的帮助文档。通过这个Cmdlet命令输出到文件每一行记录的默认宽度大小为多少个字符?是否有一个参数可以让你修改这个宽度?

12.在默认情况下,Out-File将覆盖任何已经存在具有相同的文件名。是否有一个参数可以预防Cmdlet命令覆盖现有的文件?

13.你怎么查看在PowerShell中预先定义所有别名(aliases)的列表?

14.怎么使用别名和缩写的参数名称来写一条最短的命令,就能检索出一台名为Server1计算机中正在运行的进程列表?

15.有多少Cmdlet命令可以处理普通对象?(提示:记得使用类似“object”的单数名词好过使用类似“objects”的复数名词。)

16.这一章简单提到了数组(arrays)。什么帮助主题可以告诉你关于它们的更多信息?


相关图书

深入解析Windows操作系统 (第7版)(卷2)
深入解析Windows操作系统 (第7版)(卷2)
Windows 11实用教程
Windows 11实用教程
深入解析Windows操作系统(卷2)  (英文版·第7版)
深入解析Windows操作系统(卷2) (英文版·第7版)
深入解析Windows操作系统 第7版 卷1
深入解析Windows操作系统 第7版 卷1
从零开始—— Windows 10+Office 2016综合应用基础教程
从零开始—— Windows 10+Office 2016综合应用基础教程
学电脑(Windows 10+Office 2019)从入门到精通(移动学习版)
学电脑(Windows 10+Office 2019)从入门到精通(移动学习版)

相关文章

相关课程