PowerShell 函数参数
- 定义 PowerShell 函数参数
- PowerShell 函数中的命名参数
- PowerShell 函数中的位置参数
- PowerShell 函数中的开关参数
- 在 PowerShell 函数参数中的 splatting
- PowerShell 参数属性
- 具有命名参数语法的高级函数
PowerShell 函数参数通过利用特性和参数来限制用户输入特定值,从而使函数更加强大。它添加了一些规则和验证,以防止编写大量脚本,并且它们易于使用。
一旦指定了函数参数,也可以通过命令行给出参数。命名、位置、开关和动态参数都是函数参数的示例。函数参数也可用于将基本函数转换为更复杂的函数。
定义 PowerShell 函数参数
参数定义如下。
param(
$Parameter1
)
最佳实践建议向参数添加类型并插入 Parameter()
块,以确保参数仅采用你需要的输入类型,并在未来启用更多功能。因此,它如下所示完成。
param(
[Parameter()]
[string]$Parameter1
)
甚至可以将附加参数添加到上述语法中,如下所示。
param(
[Parameter()]
[string]$Param1,
[Parameter()]
[string]$Param2
)
Write-Host "Param1 value is $Param1"
Write-Host "Param 2 value is $Param2"
PowerShell 函数中的命名参数
命名参数是在脚本中使用 PowerShell 函数参数的一种技术。使用命名参数调用脚本或函数时,使用参数的完整名称。
假设上述 PowerShell 脚本存储在 test.ps1
中。在这里,我们将为 param1 和 param2 提供值;你可以在下面的示例中注意到应该传递参数的全名。
./test.ps1 -Param1 'value' -Param2 'valuenext'
输出:
执行此脚本时,你会看到类似这样的内容,其中每个参数变量都替换为运行时提供的值。
PowerShell 函数中的位置参数
通过位置而不是名称传递项目是利用参数的另一种方式。通过位置传递参数值时,不使用参数的名称。相反,PowerShell 将每个参数的值与其在函数中的位置进行比较。PowerShell 识别出代码中的 Param1 是在 Param2 之前指定的,并以正确的顺序匹配这些值。
./test.ps1 'value' 'valuenext'
输出
Param1 value value
Param 2 value is valuenext
在上面的示例中,param1 和 param2 都被声明为字符串类型,但它不是你可以使用的唯一类型。可以使用 .NET 类库中的任何类型。
除了原始顺序之外,我们还可以通过在参数构造中给出位置来继续前进。如下所示。
param(
[Parameter(position = 1)]
[string]$Param1,
[Parameter(position = 0)]
[string]$Param2
)
Write-Host "Param1 value is $Param1"
Write-Host "Param 2 value is $Param2"
在这里,你可以看到参数的顺序发生了变化。
./test.ps1 'param2' 'param1'
PowerShell 函数中的开关参数
此参数用于使用二进制或布尔值表示某物是打开还是关闭。switch
类型用于指定它。继续上面的例子,我们将添加另一个名为 DisplayParam2
的开关参数。
param(
[Parameter()]
[string]$Param1,
[Parameter()]
[string]$Param2,
[Parameter()]
[switch]$DisplayParam2
)
Write-Host "Param1 value is $Param1"
if ($DisplayParam2.IsPresent) {
Write-Host "Param2 value is $Param2"
}
输出:
在 PowerShell 函数参数中的 splatting
splatting 主要用于参数很多的时候。在运行命令之前为脚本设置参数称为 splatting。到目前为止,你一直在运行时定义参数并将值传递给参数。一旦你有一组出现在下面的参数,这可能是一个问题。
param(
[Parameter()]
[string]$Param1,
[Parameter()]
[string]$Param2,
[Parameter()]
[switch]$DisplayParam2,
[Parameter()]
[string]$Param3,
[Parameter()]
[string]$Param4,
[Parameter()]
[string]$Param5,
[Parameter()]
[string]$Param6,
[Parameter()]
[string]$Param7
)
Write-Host "Param1 value is $Param1"
if ($DisplayParam2.IsPresent) {
Write-Host "Param2 value is $Param2"
}
Write-Host "Param3 value is $Param3"
Write-Host "Param4 value is $Param4"
Write-Host "Param5 value is $Param5"
Write-Host "Param6 value is $Param6"
Write-Host "Param7 value is $Param7"
你可以使用哈希表在单独的阶段指定参数值,而不是向右滑动,如下图所示。参数值可以整齐地对齐,从而更容易理解正在使用的参数值。
建立哈希表后,你可以指定哈希表的名称,后跟@
字符以将所有参数发送到脚本。
$params = @{
Param1 = 'value'
Param2 = 'valuenext'
Param3 = 'somevalue'
Param4 = 'somevalue'
Param5 = 'somevalue'
Param6 = 'somevalue'
Param7 = 'somevalue'
DisplayParam2 = $true
}
PS> ./test.ps1 @params
PowerShell 参数属性
参数特性允许你以多种方式更改参数功能。你可以使用正则表达式来拟合正则表达式,强制使用给定参数,并验证提供给参数的值。
强制参数
在 PowerShell 中,我们可以根据自己的意愿要求在函数中运行一个或多个属性。因此,我们可以在 Parameter()
构造中使用 mandatory
属性。
param(
[Parameter(Mandatory)]
[string]$Param1,
[Parameter()]
[string]$Param2,
[Parameter()]
[switch]$DisplayParam2
)
Write-Host "Param1 value is $Param1"
if ($DisplayParam2.IsPresent) {
Write-Host "Param2 value is $Param2"
}
输出:
参数验证
最后,仔细检查提供给参数的值是否正确。它非常适合将某人赋予参数唯一值的可能性降至最低。因此,我们可以使用 ‘ValidateSet()’ 指定我们想要的输入,如下所示。
param(
[Parameter(Mandatory)]
[ValidateSet('x', 'y')]
[string]$Param1,
[Parameter()]
[string]$Param2,
[Parameter()]
[switch]$DisplayParam2
)
Write-Host "Param1 value is $Param1"
if ($DisplayParam2.IsPresent) {
Write-Host "Param2 value is $Param2"
}
如果我们将 x 和 y 以外的值赋予 param1,则会弹出错误。
具有命名参数语法的高级函数
将 Cmdletbinding 属性添加到函数时,会将其变为高级函数。构造高级函数时使用其他常用参数。语法如下。
function testfunction
{
[CmdletBinding (DefaultParameterSetName='Param1')]
Param
(
[Parameter(Mandatory=$true, Position=0, ParameterSetName='Param1')]
[string] Param1,
[Parameter(Mandatory=$true, Position=0, ParameterSetName='Param2')]
[string] Param2,
)
}
Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.