PowerShell 技能连载 - 测试嵌套深度

当您调用一个函数时,PowerShell 会增加嵌套的深度。当一个函数调用另一个函数,或是一段脚本时,将进一步增加嵌套的深度。以下是一个能够告诉您当前代码嵌套深度的函数:

function Test-NestLevel
{
  $i = 1
  $ok = $true
  do
  {
    try
    {
      $test = Get-Variable -Name Host -Scope $i
    }
    catch
    {
      $ok = $false
    }
    $i++
  } While ($ok)

  $i
}

当您设计递归(调用自身的函数)函数时,这种方法十分有用。

以下是使用该技术的示例代码:

function Test-Diving
{
    param($Depth)

    if ($Depth -gt 10) { return }

    "Diving deeper to $Depth meters..."

    $currentDepth = Test-NestLevel
    "calculated depth: $currentDepth"

    Test-Diving -depth ($Depth+1)
}

Test-Diving -depth 1

当您运行 Test-Diving 时,该函数将调用自身,直到达到 10 米深。该函数使用一个参数来控制嵌套深度,而 Test-NestLevel 的执行结果将返回相同的数字。

请注意它们的区别:Test-NestLevel 返回所有(绝对的)嵌套级别,而参数告诉您函数调用自己的次数。如果 Test-Diving 包含在其它函数中,那么绝对的级别和相对的级别将会不同:

PS C:\> Test-Diving -Depth 1
diving deeper to 1 meters...
calculated depth: 1
diving deeper to 2 meters...
calculated depth: 2
diving deeper to 3 meters...
calculated depth: 3
diving deeper to 4 meters...
calculated depth: 4
diving deeper to 5 meters...
calculated depth: 5
diving deeper to 6 meters...
calculated depth: 6
diving deeper to 7 meters...
calculated depth: 7
diving deeper to 8 meters...
calculated depth: 8
diving deeper to 9 meters...
calculated depth: 9
diving deeper to 10 meters...
calculated depth: 10

PS C:\> & { Test-Diving -Depth 1 }
diving deeper to 1 meters...
calculated depth: 2
diving deeper to 2 meters...
calculated depth: 3
diving deeper to 3 meters...
calculated depth: 4
diving deeper to 4 meters...
calculated depth: 5
diving deeper to 5 meters...
calculated depth: 6
diving deeper to 6 meters...
calculated depth: 7
diving deeper to 7 meters...
calculated depth: 8
diving deeper to 8 meters...
calculated depth: 9
diving deeper to 9 meters...
calculated depth: 10
diving deeper to 10 meters...
calculated depth: 11

PS C:\>

Test-NestLevel 总是从当前的代码中返回嵌套的级别到全局作用域。

本文国际来源:Test Nested Depth

评论