奇怪的PowerShell递归行为

时间:2016-07-04 17:41:15

标签: powershell recursion powershell-v4.0

我正在尝试在PowerShell v4中创建递归函数。它将解析一个对象和一个级别。该对象可以是文件夹结构或XML节点。我的代码没有按预期工作,我需要帮助。问题是我如何将[int]level和一个对象传递给递归函数?

此代码将按预期工作:

function Recurs([int]$level)
{
    Write-Host $level
    if ($level -lt 5)  {
        Recurs( $level + 1 )
    }
}
Recurs(0)

它将生成此输出:

0
1
2
3
4
5

但是当我添加一个新参数时,$level使其无法记住它的值。我想这与ByVal或ByRef有关,但我不知道如何解决它。在此示例中,结果将返回无限0:

function Recurs1($obj, [int]$level)
{
    Write-Host $level
    if ($level -lt 5)  {
        Recurs1( $level + 1 )
    }
}
Recurs1('aaa', 0)

通过这个例子,

function Recurs2([int]$level, $obj)
{
    Write-Host $level
    if ($level -lt 5)  {
        Recurs2( $level + 1 )
    }
}
Recurs2(0 ,'aaa')

我收到错误:

Recurs2 : Cannot process argument transformation on parameter 'level'. Cannot convert the 
"System.Object[]" value of type "System.Object[]" to type "System.Int32".
At line:8 char:8
+ Recurs2(0 ,'aaa')
+        ~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Recurs2], ParameterBindingArgumentTransform 
   ationException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,Recurs2

1 个答案:

答案 0 :(得分:2)

在PowerShell中,你不能在调用函数时使用括号,也不能用逗号分隔参数。您可以这样调用Recurse 1

Recurs1 -obj 'aaa' -level 0

整个功能:

function Recurs1($obj, [int]$level)
{
    Write-Host $level
    if ($level -lt 5)  
    {
        Recurs1 -obj $obj -level ($level + 1)
    }
}
Recurs1 -obj 'aaa' -level 0

正如TessellatingHeckler在他删除的答案中显示的那样,您也可以通过其位置传递参数,e。 G。

Recurs1 'aaa' 0

但是,我认为当您明确指定参数名称时,您的脚本会更具可读性。