为什么调用另一个具有相同参数名称的函数使用该名称来破坏其自己的参数?

时间:2015-04-28 23:30:30

标签: powershell recursion parameters

请考虑以下代码:

function f2
{
    [CmdletBinding()]
    param( $e4da2f9 )
    process{}
}
function f1
{
    [CmdletBinding()]
    param
    (
        $e4da2f9
    )
    process
    {
        $e4da2f9 

        $command = 'f2'

        $splat = @{
            e4da2f9 = 'value passed to f2'
        }

        # the following line clobbers this function's $e4da2f9...
        . $command @splat | Out-Null

        # ...but this line does not
        # f2 @splat | Out-Null

        $e4da2f9
    }
}

f1 'value passed to f1'

运行它,令人惊讶地产生以下结果:

value passed to f1
value passed to f2

如果您注释掉. $command ...并取消注释f2 @splat ...,则会产生预期结果:

value passed to f1
value passed to f1
  1. 为什么会这样?
  2. 明确调用函数并使用. $functionName调用函数之间是否存在一些根本区别?
  3. 如果只在变量中使用其名称,如何递归调用函数?

1 个答案:

答案 0 :(得分:2)

这是因为你点源了这个功能而不仅仅是运行它(&)。你特意说在f1的范围内运行f2。

用以下内容替换违规行:

 & $command @splat | Out-Null

让它像你想要的那样工作。