PowerShell:将块作为参数传递给函数

时间:2009-12-01 17:04:52

标签: c# .net powershell parameters

我将在一个例子中解释我的问题。我们在C#中有以下代码:

void A(Action block)
{
 B(() =>
 {
  Console.WriteLine(2);
  block();
 });
}

void B(Action block)
{
 Console.WriteLine(1);
 block();
}

void Main()
{
 A(() =>
 {
  Console.WriteLine(3);
 });
}

此代码的输出为:

1
2
3

现在,我想在PowerShell中编写此代码:

function A($block) {
    B {
        2
        . $block
    }
}

function B($block) {
    1
    . $block
}

A {
    3
}

但是,此代码会导致调用深度溢出:

  

由于调用深度,脚本失败   溢出。通话深度达到1001   最大值是1000。

我发现如果我更改了函数B的参数名称,它就会起作用。

是功能还是错误(或两者兼而有之)?如何在PowerShell中完成这项工作,而不需要在函数中使用唯一的参数?

1 个答案:

答案 0 :(得分:15)

是的,你要递归,因为传递到函数B的scriptblock中的$block引用在函数B的上下文中被计算,因此,计算B的$block参数的值。

如果您不想更改参数名称(不要怪你),可以强制PowerShell在A中创建一个新的闭包,以捕获函数A中$ block的值,例如:

function A($block) 
{    
     B {Write-Host 2; &$block}.GetNewClosure()
}

function B($block) 
{
    Write-Host 1
    &$block
}

A {Write-Host 3}