仅传递提供的参数

时间:2019-06-05 06:26:32

标签: powershell

给出两个函数f1,f2,f2如何仅使用具有值的参数调用f2?

假设:

function f1($p1, $p2, $p3)
{
    f2 -p1 $p1 -p2  $p2 -p3 $p3 # how do i write this line correctly?

}

function f2($p1=100, $p2=200, $p3=300)
{
    write-host "P1: $p1"
    write-host "P2: $p2"
    write-host "P3: $p3"
}

正确:

calling:  f2 -p1 1 -p3 3
returns: P1: 1, P2: 200, P3: 3

不正确:

calling: f1 -p1 1 -p3 3
returns: P1: 1, P2: , P3: 3
but i want: P1: 1, P2: 200, P3: 3

我想发生的是,如果在调用f1()时未提供P2值,则当它到达f2()时,它应该获得P2的默认值,因此P2应该为“ 200”。

我可以通过测试每个参数(如果已定义)来完成此操作,然后将其添加到集合中以便可以使用splatting,但是我可以简化此步骤而不必测试每个参数吗?

2 个答案:

答案 0 :(得分:4)

尝试一下:

function f1
{
    param ($p1,$p2,$p3)
    $PSBoundParameters.Keys | foreach {'{0}: {1}' -f $_,$PSBoundParameters[$_]}
}

calling: f1 -p1 1 -p3 3
p1: 1
p2: 3

答案 1 :(得分:2)

我不知道其他答案是否足够清晰以达到准确的结果。我正在从Axel Anderson's Answer中吸取一些想法。

function f1($p1, $p2, $p3)
{
    f2 @PSBoundParameters

}

function f2($p1=100, $p2=200, $p3=300)
{
    write-host "P1: $p1"
    write-host "P2: $p2"
    write-host "P3: $p3"
}

Output:

f1 -p1 1 -p3 3
P1: 1
P2: 200
P3: 3

f1 -p1 1 -p3 3 -p2 2
P1: 1
P2: 2
P3: 3

请记住,这仅适用于两个函数,因为您的参数名称相同。