如何使用 PowerShell 函数

当我们编写 PowerShell 脚本时,我们有许多选项。例如,我们可以为任务编写千行代码,全部在一个代码块中。
然而,这会很复杂。所以我们应该编写 PowerShell 函数。
PowerShell 函数显著提高了我们代码的可用性和可读性,使得操作更为简便。在本文中,我们将学习如何编写函数,添加和管理函数的参数,以及设置函数以接受管道输入。
PowerShell 中函数与 Cmdlet 的区别
PowerShell 函数的概念可能听起来很熟悉,因为它听起来像原生 PowerShell cmdlet。例如,像 Write-Host
和 Start-Service
的命令与函数非常相似。
然而,cmdlet 是命名代码块,解决单一问题,且不易进行自定义。cmdlet 和函数之间的区别在于这些构造是如何制作的。
我们可以使用 Get-Command
cmdlet 及其 -CommandType
参数来查看哪些命令是 cmdlet 和函数。
Get-Command -CommandType Function
上面的命令返回当前加载到我们的 PowerShell 会话或可用于 PowerShell 的模块中的所有函数。
PowerShell 中函数的介绍
我们使用 function
关键字来定义一个函数,后跟一个描述性的用户自定义名称和一组大括号。大括号内是我们希望 PowerShell 执行的脚本块。
下面我们可以看到一个基本函数和该函数的执行。这个名为 Install-Software
的函数使用 Write-Host
在控制台显示输出消息(主要用于模拟安装)。
定义后,我们可以使用这个函数的名称来执行其脚本块内的代码。
示例代码:
function Install-Software {
Write-Host 'The software has been installed.'
}
Install-Software
输出:
The software has been installed.
PowerShell 中以动词-名词语法的函数命名约定最佳实践
函数的名称至关重要。我们可以随心所欲地命名我们的函数,但名称应始终描述函数的作用。
PowerShell 中函数命名约定的最佳实践是动词-名词语法。
我们应该始终以动词开头命名函数,后跟一个破折号和一个名词。使用 Get-Verb
cmdlet 查找 approved
动词列表。
在 PowerShell 中定义高级函数
本教程假设我们将前面的代码直接复制粘贴到 PowerShell 控制台中。在这一部分,我们也可以在脚本中定义函数。
我们在上一部分中使用了一个小函数,因此在控制台中定义它并没有什么问题。然而,大多数时候,我们将拥有更大的函数。
因此,将这些函数定义在脚本或模块中并调用该脚本或模块将函数加载到内存中会更容易。
正如我们想象的那样,每次想要调整函数功能时重新键入更大的函数可能会让人困惑。
在 PowerShell 中向函数添加参数
函数可以有任意数量的参数。当我们创建函数时,我们将有选择包括参数的选项,并决定这些参数的工作方式。
参数可以是可选的或强制的,它们可以被限制为接受有限的参数列表之一,或者接受任何内容。
例如,通过 Install-Software
函数安装的虚构软件可能有许多可能的早期版本。但是,目前,Install-Software
函数没有提供让用户指定希望安装的版本的方法。
如果我们是唯一使用该函数的人,我们可以在每次想要特定版本时更改其中的代码,但那样会浪费很多时间。这种方法也容易出现潜在错误,我们希望其他人也能使用我们的代码。
在我们的函数中引入参数使其具有可变性。就像变量使我们能够编写可以处理同一情况多种版本的脚本一样,参数将使我们能够编写一个在多种方式中执行单一操作的函数。
在这种情况下,我们希望它安装同一软件的多个版本,并在多台计算机上执行。
首先,让我们向函数添加一个参数,使用户或我们能够指定要安装的版本。
在 PowerShell 中创建一个简单的函数参数
在函数上定义参数需要一个参数块。参数块保存函数的所有参数。
定义包含 param
关键字的参数块,后面跟上括号,如下所示。
示例代码:
function Install-Software {
[CmdletBinding()]
param()
Write-Host 'The software has been installed.'
}
此时,我们函数的实际功能没有任何变化。我们只是在安装管道,为参数准备函数。
一旦我们添加了 param
块,我们可以通过将其放在括号内创建参数,如下所示。
示例代码:
function Install-Software {
[CmdletBinding()]
param(
[Parameter()]
[string] $Version
)
Write-Host "The software version $Version has been installed."
}
在上面的 param
块中,我们将首先定义 Parameter
块。使用 Parameter()
块将参数转换为“高级参数”。
像这里这样的空 param
块不执行任何操作,但这是必需的;我们将在下一部分中解释如何使用它。
让我们关注参数名称前面的 [string]
类型。我们通过在参数变量名称之前用方括号括住参数的类型来进行类型转换。
PowerShell 将始终默认将值转换为字符串。在上面,任何传递给变量 $Version
的内容将始终被视为字符串。
我们还将 $Version
添加到我们的 Write-Host
语句中。然后,当我们使用 Version
参数运行 Install-Software
函数并传入一个版本号时,我们应该会看到一条显示该信息的消息。
示例代码:
Install-Software -Version 2
输出:
The software version 2 has been installed.
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn