1. ホーム
  2. スクリプト・コラム
  3. パワーシェル

統計関数のネスト深度のPowerShell実装

2022-02-04 11:07:35

関数を呼び出すと、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回呼び出します。この関数はネストレベルを制御するために1つの引数を使用し、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: 2
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は常に、現在のコードのスコープからグローバルスコープまでのネストの深さを返します。