PowerShell实战
上QQ阅读APP看书,第一时间看更新

与大多数编程语言一样,PowerShell也有命令——泛指一切具名的可执行表达式。命令的形式多样,可以是惯常的ping.exe工具,也可以是前面提到的Get-Alias命令。甚至还可以自建命令。但如果使用不存在的命令,则会看到一段不招人喜欢的红色错误文本,如代码清单1-2所示。

代码清单1-2 输入的命令无法识别时,显示一段错误文本

PS> foo
foo : The term 'foo' is not recognized as the name of a cmdlet, function,
script file, or operable program. Check the spelling of the name, or if a
path was included, verify that the path is correct and try again.
At line:1 char:1
+ foo
+ ~~~
    + CategoryInfo          : ObjectNotFound: (foo:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

执行Get-Command命令可以列出PowerShell默认支持的所有命令。可以从这个列表中发现一个常用的模式:多数命令的名称遵从“动词-名词”形式。这是PowerShell的一大特性。为了确保语言简洁直观,微软为命令名称制定了一些指导方针。尽管这种命名约定不是强制性的,但强烈推荐自建命令时遵守。

PowerShell命令分为以下几类:cmdlet、函数、别名和外部脚本。微软提供的多数内置命令是cmdlet,通常使用C#等其他语言编写。执行Get-Command命令得到的结果中有一个CommandType字段,如代码清单1-3所示。

代码清单1-3 显示Get-Alias命令的类型

PS> Get-Command -Name Get-Alias
CommandType     Name                Version    Source
-----------     ----                -------    ------
Cmdlet          Get-Alias           3.1.0.0    Microsoft.PowerShell.Utility

函数则是使用PowerShell编写的命令。为了完成手头的任务,我们编写的往往就是函数;cmdlet一般留给PowerShell软件的开发者来写。cmdlet和函数是PowerShell中最常使用的两种命令类型。

我们将使用Get-Command命令探索PowerShell中可用的众多cmdlet和函数。你会发现,如果只输入Get-Command,不带任何参数,则控制台输出的内容很多,要向下滚动很长一段距离才能看完所有可用的命令。

在PowerShell中,很多命令有参数——提供(或传递)给命令的值,以用于定制命令的行为。例如,Get-Command就有一些参数,用以指定只返回特定的命令,而不显示全部命令。浏览Get-Command的输出,你会注意到几个常用的动词,如Get、Set、Update和Remove。你可能会想,以Get开头的命令是获取信息的,其他命令则是修改信息的。没错,你是对的。PowerShell就是这么直来直往。命令的名称都很直观,一般都表明了其意图。

我们刚开始学习,肯定不想随意改动系统,而是想从不同的源头获取信息。鉴于此,可以将Verb参数传给Get-Command命令,从而限制性地列出使用动词Get的命令。为此,在提示符中输入下列命令:

PS> Get-Command -Verb Get

不难发现,这个命令输出的内容依然很多。可以再加上Noun参数,以指定名词部分为Content,从而进一步限制输出结果,如代码清单1-4所示。

代码清单1-4 只显示动词为Get、名词为Content的命令

PS> Get-Command -Verb Get -Noun Content
CommandType     Name                Version    Source
-----------     ----                -------    ------
Cmdlet          Get-Content         3.1.0.0    Microsoft.PowerShell.Management

如果发现结果太少,可以只传递Noun参数,而不提供Verb参数,如代码清单1-5所示。

代码清单1-5 只显示名词为Content的命令

PS> Get-Command -Noun Content
CommandType     Name                Version    Source
-----------     ----                -------    ------
Cmdlet          Add-Content         3.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Clear-Content       3.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Get-Content         3.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Set-Content         3.1.0.0    Microsoft.PowerShell.Management

可以看到,Get-Command命令支持分别提供动词和名词部分。如果想将整个命令作为一个整体传递,则需要使用Name参数来指定命令的完整名称,如代码清单1-6所示。

代码清单1-6 通过名称查找Get-Content cmdlet

PS> Get-Command -Name Get-Content
CommandType     Name                Version    Source
-----------     ----                -------    ------
Cmdlet          Get-Content         3.1.0.0    Microsoft.PowerShell.Management

前文说过,PowerShell中的很多命令有定制行为的参数。可以通过PowerShell完善的帮助系统来学习参数的用法。