PowerShell 函数参数

Migel Hewage Nimesha 2023年1月30日
  1. 定义 PowerShell 函数参数
  2. PowerShell 函数中的命名参数
  3. PowerShell 函数中的位置参数
  4. PowerShell 函数中的开关参数
  5. 在 PowerShell 函数参数中的 splatting
  6. PowerShell 参数属性
  7. 具有命名参数语法的高级函数
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'

输出:

图像-20211223173801745

执行此脚本时,你会看到类似这样的内容,其中每个参数变量都替换为运行时提供的值。

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 函数中切换参数

在 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"
}

输出:

powershell 函数中的强制参数

参数验证

最后,仔细检查提供给参数的值是否正确。它非常适合将某人赋予参数唯一值的可能性降至最低。因此,我们可以使用 ‘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,
    )
}
Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

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.