2016-09-21 80 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