第3章 使用帮助系统

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

3.1 帮助系统:发现命令的方法

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

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

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

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

  • 如果你需要执行一项任务,但是却不知道应该使用什么命令,帮助系统可以帮助你找到这个命令,而不是使用Google或者Bing。
  • 如果你在运行一个命令的时候返回错误信息,帮助系统可以告诉你如何正确运行命令而不出现错误。
  • 如果你想将多个命令组合在一起来执行一项复杂的任务,帮助系统可以帮你找到哪些命令是可以和其他命令结合使用。你不需要在Google或者Bing搜索示例,只需要学习它们是怎么使用的,以便你可以创建出自己的示例和解决方案。

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

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

  • 虽然我们将在我们的示例中向你展示许多命令(我们几乎从未展示一个命令的完整功能和选项),但是你也应该阅读我们展示每个命令的帮助,这样你才会熟悉每个命令所能够完成的额外工作所能够完成的。
  • 在本书的实验里,我们将提示你使用什么命令来完成任务,但是我们不会提示语法细节。为了完成这些实验,你必须自己使用帮助系统来找到相应命令的语法。

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

是时候走下讲台了。

Command对比Cmdlet

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

3.2 可更新的帮助

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

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

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

PS C:\> help Get-ServiceNAMEGet-Service SYNTAXGet-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参数指向刚刚下载的那份帮助文档的地址。这可以让局域网内任何计算机从中心服务器获取更新后的帮助,代替从互联网获取。

3.3 查看帮助

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时,它会一次性返回所有的帮助信息,而不是一次返回一页。

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

3.4 使用帮助找命令

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

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

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

Help *log* Help *event*   

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

Name Category Module---- -------- ------ Clear-EventLog CmdletMicrosoft.PowerShell.M...Get-EventLog   Cmdlet   Microsoft.PowerShell.M... Limit-EventLog    Cmdlet   Microsoft.PowerShell.M... New-EventLog   CmdletMicrosoft.PowerShell.M... Remove-EventLog CmdletMicrosoft.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 MsDtcSet-DtcLog  Function MsDtc Get-LogProperties  Function PSDiagnosticsSet-LogProperties  Function PSDiagnosticsabout_Eventlogs HelpFileabout_Logical_OperatorsHelpFile  

注意:

你可以注意到,前面的这个列表的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”的命令列表,并且这个列表不会包括任何其他扩展应用程序或者扩展命令。

3.5 详解帮助

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

3.5.1 参数集和通用参数

大部分命令可以有很多不同的使用方式,这依赖于你需要用它们来干什么。例如,下面是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 ,并在首页搜索这本书(译者注:本书的英文名),你会获得各种免费配套材料。这些材料包含主要概念的示例视频,如参数和参数集,这可以帮助你更加容易理解它们。

3.5.2 可选和必选参数

运行一个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组合键来终止这个命令。

3.5.3 定位参数

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

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

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

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

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

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

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

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

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

  • 定位参数可以同时出现指定和不指定参数名的情况,但是定位参数必须处在正确的位置。例如,Get-EventLog -newest 20 -Log Application 是正确的;System 会被匹配到-LogName参数,因为这是第一个位置的参数值,20将表示-Newest参数值,因为你已经使用了参数名。
  • 指定参数名总是正确的。当你这样做了,输入的顺序就变得不重要。Get-EventLog- newest 20-Log Application是正确的,因为我们已经使用了参数名(在这个示例中是-LogName,我们这里使用了缩写-Log)。
  • 如果使用多个定位参数,不要忘了它们的位置。Get-EventLog Application 0是可以运行的,Application会附加到-LogName参数,0会附加到-InstanceId参数。Get-EventLog 0 Application会运行失败,因为0会附加-LogName参数名,但是却找不到名为“0”的日志。

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

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

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

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

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

-LogName <string>  指定事件日志。输入一个事件日志的日志名称(Log 属性的值;而非 LogDisplayName)。  不允许使用通配符。此参数是必需的。  是否必需?True   位置?1   默认值  是否接受管道输入?False   是否接受通配符? False   

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

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

3.5.4 参数值

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

[-AsString]   

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

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

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

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

[-LogName] <string>   

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

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

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

  • String——一系列字母和数字,有些时候也会包含空格符。如果出现空格符,那么全部字符串必须包含在引号内。例如,类似C:\Windows的字符串不需要使用引号,但是C:\Program Files这样的字符串就需要,因为它包含了一个空格。现在,你可以交替使用单引号或者双引号,但是最好坚持使用单引号。
  • Int,Int32,or Int64——一个整数类型(整个数字不包含小数)。
  • DateTime——通常,基于你本地计算机的时区配置,字符串被解释成的日期会有所不同。在美国,通过的日期格式为10-10-2010,即月-日-年。

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

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

[-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组合键来终止命令。

3.5.5 发现命令示例

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

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

Help Get-EventLog -example   

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

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

3.6 访问“关于”主题

在本章的前面部分,我们提到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 (使用搜索)

3.7 访问在线帮助

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

Help Get-EventLog -online  

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

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

3.8 动手实验

注意:

在本实验中,你需要在计算机中运行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 PowerShell 实战指南》