三、PowerShell-使用帮助系统
文章目录
类似于Linux的man(manual)功能,PowerShell也提供有对应的功能。
1、帮助系统使用场景
- 如果你需要执行一项任务,但是却不知道应该使用什么命令,帮助系统就可以帮助你找到这个命令,而无需使用Google或者Bing。
- 如果你在运行一个命令的时候返回错误信息,帮助系统就可以告诉你如何正确的运行命令,因此不再出现错误。
- 如果你想将多个命令组合在一起来执行一项复杂的任务,帮助系统就可以帮助你找到哪些命令是可以和其他命令结合使用。你不需要在Google或者Bing搜索示例,只需要学习如何使用它们,以便你可以创建出自己的示例和解决方案。
掌握帮助系统是成为PowerShell专家的一个关键。
PowerShell包含了多种类型的可执行命令,有些叫做Cmdlet,有些叫做函数,还有一些被称为工作流等。它们的共同点都是命令,所有这些命令都在帮助系统囊括的范围内。Cmdlet的概念是PowerShell中独有的,你运行的大多数命令都属于Cmdlet。
2、更新帮助系统
PS V3中加入了“可更新的帮助”,可以通过互联网下载帮助文件的更新、修正和扩展。
必须要以管理员身份运行Update-Help才可以,否则帮助系统会提示,因为其帮助内容在System32这个系统目录下。
每隔一个月左右的时间重新获取帮助是一个很重要的习惯。
如果你的计算机无法连上互联网,则可以先通过可以联网的机器,使用Save-Help命令将帮助文档下载一份到本地。然后把它放到一个文件服务器或者其他你可以访问的网络中。然后通过Update-Help加上-SourcePath参数只想刚刚下载的拿分帮助文档的地址。
微软的PS帮助文档已经在http://github.com/powershell开源。
3、查看帮助
提供Get-Help这个Cmdlet命令访问帮助系统。Man和Help都不是原生的Cmdlet命令,而是核心Cmdlet命令进行封装后的函数。macOS与Linux中的帮助文件,都使用操作系统的Man(Manual)功能进行显示,该命令会“接管”屏幕,从而显示帮助,在阅读完帮助后返回正常屏幕。
Help的工作原理类似Get-Help,但它可以把输出的信息通过管道传送给More命令。这样你就可以以分屏这样友好的方式来查看帮助内容,而不是一次性打印出所有的帮助信息。运行Help Get-Content和Get-Help Get-Content,会返回相同的结果。前者是一次一页显示,你也可以使用Get-Help Get-Content | More分页显示,但着需要输入更多的字符,我们通常仅使用Help。但我们想让你知道底层实现。
从技术上来说,Help是一个函数,而Man是Help的一个别名,或者叫昵称。
在Shell控制台窗口按Ctrl+C组合键取消命令并立即返回到Shell。在图形化ISe中,则表示拷贝到剪切板。
帮助系统有两个主要目标:一个是帮助你找到实现特定任务的命令,另一个就是找到命令后帮助你学会如何使用它们。
4、使用帮助系统查找命令
与大多数命令一样,Get-Help有几个参数。其中一个最为重要的参数是-Name。该参数指定你想要访问帮助的主题名称,并且它是一个位置参数,所以你无需输入-Name,只需要提供所需查找的命令名称。它也支持通配符,这让帮助系统更加容易找到命令。
例如,你想操作系统事件日志,但是你不知道使用哪个命令,你决定搜索包含事件日志的帮助主题,可以运行下面两个命令中的一个。
前面的列表中有许多关于事件日志的函数,它们都基于“动词-名词”这个命名格式,但是最后出现了两个关于帮助主题的特殊Cmdlet命令却不是这种格式。这两个“about”主题提供了关于某个命令的背景信息。最后一个看起来跟事件日志没有关系,但是它被搜索到是因为其中一个单词“logical”的其中一部分包含了“log”。只要有可能,我们尽量使用“*event*”或者“*log*”搜索,而不是使用“*eventlog*”,因为这样可以返回尽可能多的结果。
当发现一个Cmdlet有可能完成所需要完成的工作时,可以查看该Cmdlet的帮助文档进行确认。
不要忘记使用Tab键补全命令!它可以让你只输入部分命令名称,按下Tab键,接着Shell会完成与你刚刚输入最接近的命令。继续按则选择其他匹配命令。
这个文档被称为概要帮助,这意味着它只有简单的命令描述和语法提示。当你需要快速了解如何使用一个命令时,这些信息非常有用,我们通过帮助文档来进行示例讲解。
你也可以通过Get-Command命令搜索Cmdlet命令(或者它的别名Gcm)。
5、帮助详解
PowerShell的Cmdlet帮助文档有一些特殊的约定,从这些帮助文件中提取大量信息的关键是你需要明白自己在寻找什么,并学会更高效地使用这些Cmdlet命令。
(1)、参数集和通用参数
这里以Get-Eventlog为示例说明了参数集和通用参数:
该命令在语法部分出现了两次,这表示这个命令提供了两个不同的参数,你可以有两种方式使用该命令。你可能注意到,有些参数是这两个参数集共享的。例如,这两个参数集都包含-ComputerName参数。但是这两个参数集总会有些差异。在这个实例中,第一个参数集提供了-AsString和-List,这两个参数都没有出现在第二个参数集中;而第二个参数集包含许多第一个参数集中没有的参数。
如果你使用一个只包含在某个参数集中的参数,那么你就只能使用同一个参数集里的其他参数。
你可能已经注意到,在每个PowerShell的Cmdlet参数的结尾都有[]。不管你以何种方式使用Cmdlet,这泛指每个Cmdlet命令都是使用的一组包含8个参数的集合。现在暂时不讨论通用参数,我们会在本书后面章节真正使用它们的时候来讨论。不过,在本章后面,如果你有兴趣,我们会告诉你哪里可以学习到更多关于通用参数的知识。
(2)、可选和必选参数
运行一个Cmdlet命令时,你无需提供全部参数。PowerShell的帮助文档把可选参数放到一个方括号中。例如,[-ComputerName <string[]>]表示整个-ComputerName参数是可选的。你可以不使用该参数,因为在没有为该参数指定一个具体值的时候,Cmdlet会默认为本地计算机。这也就是为什么[]在方括号内,你就可以在不使用任何通用参数的情况下运行该命令。
(3)、位置参数
PowerShell设计者知道有些参数会被频繁地使用,而你不希望不断地输入参数名称。通常来说,参数是具有位置性的。这意味着只要你把参数值放在正确的位置,你就可以只提供这个参数值,而不需要输入具体的参数名。
有两种方式可以用于确定位置参数:通过语法概要或者通过详细的帮助文档。
- 在语法概要中找到位置参数
你可以在语法概要中找到第一种方式:只有参数名被方括号括起来的参数。比如,查看Get-EventLog的第二个参数集的前两个参数。
[-LogName] [[-InstanceId] <Int64[]>]
第一个参数:-LogName。它是必选参数。我们可以识别出它是必选参数,是因为它的参数名称和参数值不在一个方括号里面。但是它的参数名称处在一个方括号内,这让它成了一个位置参数,所以我们可以只提供日志名称而不需要输入参数名称-LogName。并且由于该参数出现在帮助文档的第一个位置,所以我们知道这个日志名称是我们必须提供的第一个参数。
位置参数可以同时出现指定和不指定参数名称的情况,但是位置参数必须处在正确的位置。
- 在详细的帮助文档中找到位置参数
我们说通常有两种方式来位置参数。第二种方式需要你使用Help命令指定-full参数来打开帮助文档。
运行Help Get-EventLog -full命令。
(4)、参数值
帮助文档同样给你提供了每个参数的数据类型。有些参数被称为开关参数,无需任何输入值。在缩写语法中,它们看起来如下所示。
[-AsString]
在详细语法中,它们看起来如下所示。
-AsString [] 以字符串而非对象的形式返回输出。 是否必需? False 位置? named 默认值 是否接受管道输入? False 是否接受通配符? False
通过[]可以确认这是一个开关参数,并不需要任何输入值。开关参数的位置可以随意放置,你必须输入参数名(或者至少是一个缩写)。开关参数总是可选的,这可以让你选择是否使用它们。
(5)、发现命令示例
我们倾向于通过示例学习,这就是在本书放置大量示例的原因。PowerShell的设计者知道大部分管理员都喜欢示例,这也是他们把大量的示例放置到帮助文档的原因。如果你滚动到Get-EventLog帮助文档的末尾,很可能发现大量如何使用该Cmdlet命令的例子。
如果你只想查看示例,我们有一个简单获取到这些示例的方法:在Help命令中加入-example参数,而不是使用-full参数。
6、访问“关于”主题
我们提到PowerShell的帮助系统包含许多背景主题,可以用来帮助定位指定的Cmdlet命令。这些背景主题通常被称为“关于”主题,因为它们都是以“about_”开头的。
7、访问在线帮助
owerShell的帮助文档是由人编写的,这意味着它们并不一定准确无误。除了更新帮助文档(你可以运行Update-Help),微软也在其网站上发布帮助文档。PowerShell help命令的-online参数,使用它可以在网络中找到你所想要命令的帮助信息:
Help Get-EventLog -online
微软的TechNet 站点承载该帮助,并且它通常比安装PowerShell中帮助文档要更新。
8、操作练习
- 1.运行Update-Help并确保它执行无误。这会让你的本机下载一份帮助文档。条件是你的电脑能连上互联网,并且需要在更高特权下运行Shell(这意味着必须在PowerShell的标题中出现“管理员”的字眼)。
- 2. 仅Windows:哪一个Cmdlet命令能够把其他Cmdlet命令输出的内容转换到HTML?
通过help html了解:
或可以尝试使用Get-Command:
get-command –noun html
- 3.部分仅Windows:哪一个Cmdlet命令可以重定向输出到一个文件(file)或者到打印机(printer)?
help file
help printer
- 4.哪一个Cmdlet命令可以操作进程(processes)?(提示:记住,所有Cmdlet命令都包含一个名词。)
help *Process
- 5.你可以用哪一个Cmdlet命令向事件日志(log)写入(write)数据(该步骤仅在Windows系统有效,但你可以得到一个不同的答案)?
help *log
- 6.你必须知道别名是Cmdlet命令的昵称。哪一个Cmdlet可以用于创建、修改或者导入别名(aliases)?
help *alias
- 7.怎么保证你在Shell中的输入都在一个脚本(transcript)中,怎么保存这个脚本到一个文本文件中?
help transcript
- 8.仅Windows:从安全事件(event)日志检索所有的条目可能需要很长时间,你怎么只获取最近的100条记录呢?
help Get-Eventlog –parameter Newest
- 9.仅Windows:是否有办法可以获取一个远程计算机上安装的服务(services)列表?
help Get-Service –parameter computername
- 10.是否有办法可以看到一个远程计算机运行了什么进程(processes)(你可以在非Windows操作系统找到答案,但命令本身会有区别)?
help Get-Process –parameter computername
- 11.尝试查看Out-File这个Cmdlet命令的帮助文档。通过该Cmdlet命令输出到文件每一行记录的默认宽度大小为多少个字符?是否有一个参数可以让你修改这个宽度?
Help Out-File –full
- 12.在默认情况下,Out-File将覆盖任何已经存在具有相同的文件名。是否有一个参数可以预防Cmdlet命令覆盖现有的文件?
Help Out-File –full
- 13.如何查看在PowerShell中预先定义所有别名(aliases)列表?
Get-Alias
- 14.怎么使用别名和缩写的参数名称来写一条最短的命令,从而能检索出一台名称为Server1的计算机中正在运行的进程列表?
ps –c server1
- 15.有多少Cmdlet命令可以处理普通对象?(提示:记得使用类似“object”的单数名词好过使用类似“objects”的复数名词。)
get-command –noun object
- 16.这一章简单提到了数组(arrays)。哪一个帮助主题可以告诉你关于数组的更多信息?
help about_arrays