奇怪的 PowerShell 递归行为

Posted

技术标签:

【中文标题】奇怪的 PowerShell 递归行为【英文标题】:Strange PowerShell Recursive Behaviour [duplicate] 【发布时间】:2016-11-06 11:47:27 【问题描述】:

我正在尝试在 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 有关,但我不确定如何解决它。在本例中,结果将返回无穷大:

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】:

在 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 在他删除的答案中显示的那样,您也可以通过其位置传递参数,例如。 G。

Recurs1 'aaa' 0

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

【讨论】:

以上是关于奇怪的 PowerShell 递归行为的主要内容,如果未能解决你的问题,请参考以下文章

Powershell解压缩功能 - 奇怪的行为

将 Excel 工作表导出到 PDF 文件时出现奇怪的 Powershell 行为

JavaScript递归奇怪的行为?

Rails递归查看对象关联的奇怪行为

boost::variant:递归向量类型的奇怪行为

递归泛型类型来扩展类型 - 奇怪的行为,这是一个错误吗?