探索 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-let)。
每个 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
cmdlet 返回一个很长的谓词列表。 “说明”为谓词的用途提供上下文。 下面是前几行的输出:
Verb AliasPrefix Group Description
---- ----------- ----- -----------
Add a Common Adds a resource to a container, or attaches an item to another item
Clear cl Common Removes all the resources from a container but does not delete the container
Close cs Common Changes the state of a resource to make it inaccessible, unavailable, or unusab…
Copy cp Common Copies a resource to another name or to another container
Enter et Common Specifies an action that allows the user to move into a resource
Exit ex Common Sets the current environment or context to the most recently used context
...
使用 Get-Command 查找命令
Get-Command
cmdlet 将返回系统上安装的所有可用命令的列表。 返回的列表会非常大。 可以通过使用参数或帮助程序 cmdlet 筛选响应来限制返回的信息量。
根据名称筛选
你可以使用不同的参数筛选 Get-Command
的输出。 通过筛选,可以查找具有特定属性的命令。 使用 Name 参数,可以按名称查找特定命令。
Get-Command -Name Get-Process
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Get-Process 7.0.0.0 Microsoft.PowerShell.Management
如果想要查找所有适用于进程的命令,该怎么办? 可以使用通配符 *
来匹配其他形式的字符串。 例如:
Get-Command -Name *-Process
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Debug-Process 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Get-Process 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Start-Process 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Stop-Process 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Wait-Process 7.0.0.0 Microsoft.PowerShell.Management
根据名词和谓词进行筛选
还有其他可筛选谓词和名词值的参数。 命令名称的谓词部分位于最左侧。 谓词应为 Get-Verb
cmdlet 返回的值之一。 命令的最右边是名词部分。 名词可以是任何内容。
根据谓词进行筛选。 在命令
Get-Process
中,谓词部分为Get
。 要筛选谓词部分,请使用 Verb 参数。Get-Command -Verb 'Get'
此示例列举出使用谓词
Get
的所有命令。根据名词进行筛选。 在命令
Get-Process
中,名词部分是Process
。 要筛选名词,请使用 Noun 参数。 以下示例返回包含以字母U
开头的名词的所有 cmdlet。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 筛选结果
还可以使用其他 cmdlet 来筛选结果。
Select-Object
。 此通用命令可帮助你从一个或多个对象中选取特定属性。 还可以限制返回的项目数。 以下示例返回当前会话中前 5 个可用命令的 Name 和 Source 属性值。Get-Command | Select-Object -First 5 -Property Name, Source
Name Source ---- ------ Add-AppPackage Appx Add-AppPackageVolume Appx Add-AppProvisionedPackage Dism Add-AssertionOperator Pester Add-ProvisionedAppPackage Dism
有关详细信息,请参阅 Select-Object。
Where-Object
。 此 cmdlet 允许根据属性值筛选返回的对象。 命令采用可以测试属性值的表达式。 以下示例返回以p
开头的ProcessName
的所有进程。Get-Process | Where-Object {$_.ProcessName -like "p*"}
Get-Process
cmdlet 返回进程对象的集合。 要对响应进行筛选,可以使用管道将输出“发送”到Where-Object
。 使用管道“发送”表示通过管道|
字符连接两个或更多个命令。 一个命令的输出作为下一个命令的输入发送。Where-Object
的筛选表达式使用-like
运算符来匹配以字母p
开头的进程。
使用 Get-Member 浏览对象
当你能够找到所需的 cmdlet 后,需要进一步了解它生成的内容, 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 仅显示几个属性。 前面的示例显示了 Name
、MemberType
和 Definition
成员。 可以使用 Select-Object
来指定要查看的属性。 例如,你希望仅显示 Name
和 Definition
属性:
Get-Process | Get-Member | Select-Object Name, Definition
按参数类型搜索
Get-Member
向我们展示了 Get-Process
返回 Process 类型对象。 Get-Command
的 ParameterType 参数可用于查找将 Process 对象作为输入的其他命令。
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…
了解命令的输出类型有助于缩小相关命令的搜索范围。