2016-09-21 81 views
0

我使用的参数验证在高级功能(PowerShell的V4):如何将参数传递给PowerShell高级函数?

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 
) 

我想管参数1和参数的测试,它的功能从一个哈希表:

$ht.GetEnumerator() | % { $_.Name, $_.Value } | TestIt 

问题是每个名称 - 值对作为一个参数而不是两个参数在位置1,位置2传递。我试过使用$ args [n],但参数语法不允许它。

如何将键值对作为两个不同的参数传递给高级函数?

+0

为了回避这个问题,你可以使用有序的,而不是散列 –

+0

如果我重构我的哈希表看起来像这样:''param1'='value1';'param2'='value2''我管这样:'' $ ht.GetEnumerator()| %{$ _} |测试它'也许命名参数将工作。我从参数定义中删除了'Position = n' ...仍在测试... – jott19

+0

pkew我被推迟了,https://technet.microsoft.com/en-us/magazine/gg675931.aspx https:// www .bing.com/search?q = powershell + splatting –

回答

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 } 

您设置应该按预期任何验证。

+0

为什么不只是Test-Hash @hash ??? Get-Help about_Splatting –

+0

工作原理:'$ ht.GetEnumerator()| AdvFunction -NamedParam1 {$ _。Key} -NamedParam2 {$ _。Value}'thx! – jott19

+0

@JaquelineVanek因为这会做一些完全不同的事情。当散列表键与参数匹配(所以键仅用于匹配参数和参数),并且需要多个散列表才能获得多个结果时,散点图非常有用。这里键和值都用作函数的参数,一个散列表可以根据需要产生尽可能多的结果。 – BartekB