探索 PowerShell

PowerShell 是一种命令行 shell 和脚本语言一体化工具。 PowerShell 由 Windows 推出。 它原本是为了帮助实现管理任务自动化,但现已发展为跨平台,可用于执行多种任务。

PowerShell 的独特之处在于,它接受并返回 .NET 对象而非文本。 这个特点让它可以更轻松地在一个管道中串联不同的命令。

不过,即便如此,你也可能需要对结果进行一些处理。

PowerShell 有哪些用途?

从 PowerShell 仅适用于 Windows 之时,它的用途就在不断扩展。 它仍用于实现 Windows 任务自动化,不过,如今可使用它完成多种任务,例如:

  • 云管理。 可以使用 PowerShell 管理云资源。 例如,可以检索有关云资源的信息,也可以更新或部署新资源。
  • CI/CD。 它也可以用作持续集成/持续部署管道的一部分。
  • 将 Active Directory 和 Exchange 任务自动化。 使用它,几乎可将所有的 Windows 任务自动化,例如在 Active Directory 中创建用户以及在 Exchange 中创建邮箱。

还有更多的使用领域,上面列出的内容表明,PowerShell 已取得了很大进展。

谁使用 PowerShell?

PowerShell 的功能非常强大,担任不同工作角色的许多人群使用它时都能获益。 传统上,系统管理员角色已在使用 PowerShell,但现在自称 DevOps、云 Ops 甚至开发人员的人也在使用它。

PowerShell cmdlet

PowerShell 随附数百个预安装命令。 PowerShell 命令称为 cmdlet;读作“command-lets”。

每个 cmdlet 的名称都包含一个“谓词-名词”对。 例如 Get-Process。 这种命名约定便于人们了解 cmdlet 的作用。 还能让你更轻松地找到所查找的命令。 当你查找要使用的 cmdlet 时,可以根据谓词或名词进行筛选。

使用 cmdlet 探索 PowerShell

当你第一次学习 PowerShell 时,它可能会让人望而生畏,因为似乎要学习许多内容。 PowerShell 经过专门设计,你可以在需要它时一次学习少量知识。

PowerShell 包含 cmdlet,它们可帮助你探索 PowerShell。 通过使用下面三个 cmdlet,可以了解有哪些命令可用、这些命令执行什么操作,以及它们在什么类型上运行。

  • Get-Verb. 运行此命令时,将返回大多数命令遵循的谓词的列表。 响应包括有关这些谓词的功能的说明。 由于大多数命令都遵循这种命名,因此它对命令的功能设置了预期目标。 如果你要创建命令,这有助于选择适当的命令和命令名称。
  • Get-Command. 此命令会检索计算机上安装的所有命令的列表。
  • Get-Member. 它在基于对象的输出上运行,并且能够发现可用于命令的对象、属性和方法。
  • Get-Help. 以命令名称为参数调用此命令,将显示一个帮助页面,其中说明了命令的各个部分。

通过使用这些命令,可以了解几乎所有关于 PowerShell 的知识。

谓词

谓词是 PowerShell 中的一个重要概念。 它是大多数 cmdlet 都遵循的一种命名标准。 你在编写自己的命令时,也应遵循此命名标准。 其中的思路是,谓词表示你尝试执行的操作,例如读取数据或更改数据。 PowerShell 有一个标准化的谓词列表。 要获取所有可用谓词的完整列表,请使用 Get-Verb cmdlet:

Get-Verb

运行后的输出内容是一个很长的谓词列表。 响应还会提供更多信息:显示更多上下文、说明此类谓词用于执行什么操作。 此输出的第一行如下所示:

Verb        AliasPrefix Group          Description
----        ----------- -----          -----------
Add         a           Common         Adds a resource to a container, or attaches an item to ano…

使用 Get-Command 查找命令

Get-Command cmdlet 将返回系统上安装的所有可用命令的列表。 但是返回的列表会非常大。 为了更方便地查找命令,可以限制返回的信息量。 可以使用参数或使用帮助程序 cmdlet 筛选响应。

根据名称筛选

你可以使用不同的参数筛选 Get-Command 的输出。 这样的筛选方式就是在命令上查询特定属性。 其中的思路是,你指定要作为筛选依据的属性,然后提供要匹配的字符串。 因此,你会得到类似于下面所示的比较:

Get-Command -Name '*Process'

此时,筛选操作尝试对提供的字符串参数执行完全匹配。 如果你想要提高灵活性,可以在比较中使用通配符 * 来执行模式匹配。 下面的代码会查找名称以 process 结尾的所有命令:

上面的示例中使用了参数 -Name 进行筛选。 除了 -Name 之外,你还可以根据 -ParameterName-Type 之类的内容进行筛选。

根据名词和谓词进行筛选

你已了解如何根据 -Name 进行筛选,并且知道还可以根据其他参数进行筛选。 同样,你也可以根据谓词和名词进行筛选。 这种筛选针对的是命令名称的一部分。

  • 根据谓词进行筛选。 命令名称的谓词部分位于最左侧。 在命令 Get-Process 中,谓词部分为 Get。 若要根据谓词部分进行筛选,请指定 -Verb 作为参数,如下所示:

    Get-Command -Verb 'Get'
    

    上述命令将列出谓词部分为 Get 的所有命令。

  • 根据名词进行筛选。 命令的最右边是名词部分。 谓词应是调用 Get-Verb 所返回的谓词之一,而名词可以是任何内容。 在命令 Get-Process 中,名词部分是 Process。 若要根据名词进行筛选,请指定 -Noun 作为参数和字符串参数,如下所示:

    Get-Command -Noun U*
    

如果仅使用谓词或仅使用名词作为筛选依据,生成的结果范围仍然可能很大。 若要缩小搜索范围,最好将这两个参数组合起来,如下面的示例所示:

Get-Command -Verb Get -Noun U*

上述示例的结果如下:

CommandType     Name                         Version    Source
-----------     ----                         -------    ------
Cmdlet          Get-UICulture                7.0.0.0    Microsoft.PowerShell.Utility
Cmdlet          Get-Unique                   7.0.0.0    Microsoft.PowerShell.Utility
Cmdlet          Get-Uptime                   7.0.0.0    Microsoft.PowerShell.Utility
Cmdlet          Get-UsageAggregates          2.0.0      Az.Billing

这样的话,知道谓词及名词后,就大幅缩小了输出范围。

使用帮助程序 cmdlet 筛选结果

除了使用参数进行筛选以外,还可以使用命令帮助你执行此任务。 下面的命令可以用作筛选器:

  • Select-Object. 这是一个非常通用的命令,可帮助你从一个或多个对象中选取特定属性。 另外,还可以使用此命令的参数来限制收到的响应。 下面的 Select-Object 示例用于请求获得有限数量的记录:

    Get-Command | Select-Object -First 3
    

    上面示例的结果是从顶部往下数的前三个命令。 结果如下所示:

    CommandType     Name                                               Version    Source
    -----------     ----                                               -------    ------
    Alias           Add-AdlAnalyticsDataSource                         1.0.2      Az.DataLakeAnalytics
    Alias           Add-AdlAnalyticsFirewallRule                       1.0.2      Az.DataLakeAnalytics
    Alias           Add-AdlStoreFirewallRule                           1.3.0      Az.DataLakeStore
    

    此命令值得进一步探究,因为它还有许多其他用途。请参阅 Select-Object 文档

  • Where-Object. where object 可帮助你根据属性值从集合中选择对象。 此命令会采用一个表达式,你可以在其中说明要将哪些列与哪些值进行匹配。 若要查找其中的 ProcessNamep 开头的所有 process 对象,可以使用 Where-Object,如下所示:

    Get-Process | Where-Object {$_.ProcessName -like "p*"}
    

    在上面的示例中,Get-Process cmdlet 会生成一个 process 对象集合。 要对响应进行筛选,可以使用管道“发送”命令 Where-Object。 使用管道“发送”表示通过管道 | 字符连接两个或更多个命令。 其中的思路是,一个命令的输出作为下一个命令的输入,从左向右进行读取。 Where-Object 使用表达式进行筛选。 此表达式使用 -like 运算符和包含通配符表达式的字符串参数。

使用 Get-Member 浏览对象

当你能够找到所需的 cmdlet 后,需要进一步了解它生成的内容,即输出。 输出很有趣,它有几个特点:

  • 独立。 你可能只运行了一个 cmdlet,但需要在某种报表中显示输出。 你要问自己以下问题:命令生成的输出是否适合你,或者你是否需要进行更改。
  • 在管道中使用时。 在管道中连接几个命令,以便提取数据、筛选数据并在最后转换数据,这种做法在 PowerShell 中很常见。 若要让命令适合管道,必须了解该命令生成的输入和输出。 其中的思路是,一个命令的输出用作另一个命令的输入。

Get-Member cmdlet 将显示结果对象的类型、属性和方法。 将你要检查的输出发送到 Get-Member

Get-Process | Get-Member

结果显示返回的类型(以 TypeName 形式)以及对象的所有属性和方法。 下面是此类结果的一段摘录:

TypeName: System.Diagnostics.Process

Name        MemberType     Definition
----        ----------     ----------
Handles     AliasProperty  Handles = Handlecount
Name        AliasProperty  Name = ProcessName

对象通常具有许多属性和方法,你可以对结果进行筛选,以便更轻松地找到要查找的内容。 例如,通过使用 -MemberType 参数,可以指定要查看所有方法,如下面的示例所示:

Get-Process | Get-Member -MemberType Method

在返回的响应中,PowerShell 通常只显示少量属性。 上面的响应中显示了 NameMemberTypeDefinition。 若要更改显示结果,可以使用 cmdlet Select-Object。 使用 Select-Object,可以指定要查看哪些列。 你可以为它提供列名称、以逗号分隔的列表或通配符 *。 下面的示例使用 Select-Object 检索 NameDefinition

Get-Process | Get-Member | Select-Object Name, Definition

按类型搜索

搜索所需命令的另一种方法是,搜索在同一类型上运行的所有命令。 使用 Get-Member 后,收到的返回类型是响应的第一行,如下所示:

TypeName: System.Diagnostics.Process

现在可以使用此类型,并按如下所示搜索命令:

Get-Command -ParameterType Process

上面的调用将获得一个列表,其中是只在 Process 类型上运行的命令:

CommandType     Name                         Version    Source
-----------     ----                         -------    ------
Cmdlet          Debug-Process                7.0.0.0    Microsoft.PowerShell.Managem…
Cmdlet          Enter-PSHostProcess          7.1.0.0    Microsoft.PowerShell.Core
Cmdlet          Get-Process                  7.0.0.0    Microsoft.PowerShell.Managem…
Cmdlet          Get-PSHostProcessInfo        7.1.0.0    Microsoft.PowerShell.Core
Cmdlet          Stop-Process                 7.0.0.0    Microsoft.PowerShell.Managem…
Cmdlet          Wait-Process                 7.0.0.0    Microsoft.PowerShell.Managem…

如你所见,知道命令类型后,可以大幅缩小你可能需要的命令的搜索范围。

练习 - 调用第一个命令

在此练习中,你将学习如何运行第一个命令。

  1. 键入 pwsh,以启动 PowerShell 控制台:

    pwsh
    
  2. 运行以下 $PSVersionTable.PSVersion

    $PSVersionTable.PSVersion
    

    输出如下所示:

    Major  Minor  Patch  PreReleaseLabel BuildLabel
    -----  -----  -----  --------------- ----------
    7      1      0
    

    祝贺你,你已成功运行了第一个命令,而且已能够获取有关系统安装的 PowerShell 版本的信息。

在此练习中,你的目标是了解命令的详细信息。 在这个过程中,你还会了解一些其他信息,例如命令在哪种类型上运行,以及有哪些其他类似命令在同一类型上运行。

  1. 确保你已启动 PowerShell shell

  2. 运行命令 Get-Process

    Get-Process | Get-Member | Select-Object TypeName -Unique
    

    输出如下所示:

    TypeName
    --------
    System.Diagnostics.Process
    --------
    

    你将获得的结果是 Get-Command 命令返回的类型。 此时,可以查看哪些其他命令也在这些类型上运行。

  3. 运行命令 Get-Command

    Get-Command -ParameterType Process
    

    输出如下所示:

    CommandType     Name                         Version    Source
     -----------     ----                        -------    ------
     Cmdlet          Debug-Process               7.0.0.0    Microsoft.PowerShell.Managem…
     Cmdlet          Enter-PSHostProcess         7.1.0.0    Microsoft.PowerShell.Core
     Cmdlet          Get-Process                 7.0.0.0    Microsoft.PowerShell.Managem…
     Cmdlet          Get-PSHostProcessInfo       7.1.0.0    Microsoft.PowerShell.Core
     Cmdlet          Stop-Process                7.0.0.0    Microsoft.PowerShell.Managem…
     Cmdlet          Wait-Process                7.0.0.0    Microsoft.PowerShell.Managem…
    

    祝贺你,你已成功找到在同一类型 Process 上运行的其他命令。 要了解接下来还应该检查哪些命令,可以从使用 Get-Member 开始。

总结

在第一部分中,你已经了解了 PowerShell 的概念,以及它可用于哪些方面。 然后,你学习了 cmdlet 的相关知识,具体了解了 Get-CommandGet-VerbGet-Member。 了解这些 cmdlet 非常重要,此过程会指导你如何学习。 在下一部分中,你将了解如何使用功能强大的帮助系统。

其他资源