我在高级功能(PowerShell v4)中使用参数验证:
Function Test-It {
[cmdletbinding(DefaultParameterSetName='set1')]
Param (
[Parameter(ParameterSetName='set1',Position=0,Mandatory=$true,ValueFromPipeline=$true)]
[ValidatePattern("regex1")][string]$param1,
[Parameter(ParameterSetName='set1',Position=1,Mandatory=$true,ValueFromPipeline=$true)]
[ValidatePattern("regex2")][string]$param2
)
我想从一个哈希表中将param1和param2传递给Test-It函数:
$ht.GetEnumerator() | % { $_.Name, $_.Value } | TestIt
问题是每个名称 - 值对作为一个参数而不是位置1,位置2中的两个参数传递。我尝试使用$ args [n],但参数语法不允许它
如何将键值对作为两个不同的参数传递给高级函数?
答案 0 :(得分:1)
我猜答案取决于你的最终目标。似乎所有你想要实现的是使用哈希表中的键/值组合作为两个参数的值。如果是这种情况,那么我建议使用不同的管道绑定:ByPropertyName
。这个采用管道对象并查找与参数名称匹配的属性(它也可以是参数别名)。如果参数名称不重要,您可以将其简化为:
function Test-Hash {
param (
[Parameter(ValueFromPipelineByPropertyName = $true)]
[String]$Key,
[Parameter(ValueFromPipelineByPropertyName = $true)]
[String]$Value
)
process {
"Key = $Key, Value = $Value"
}
}
@{
a = 1
b = 2
}.GetEnumerator() | Test-Hash
如果参数的名称应该不同,您可以定义别名,或使用ByPropertyName
绑定的强大功能:事实上您可以将脚本块传递给此类参数,其行为类似于ForEach-Object
cmdlet:
function Test-AwesomeHash {
param (
[Parameter(ValueFromPipelineByPropertyName = $true)]
[String]$First,
[Parameter(ValueFromPipelineByPropertyName = $true)]
[String]$Second
)
process {
"First = $First, Second = $Second"
}
}
@{
a = 1
b = 2
}.GetEnumerator() | Test-AwesomeHash -First { $_.Key } -Second { $_.Value }
您在那里设置的任何验证器都应按预期工作。