2016-07-04 11 views
1

PowerShell v4で再帰関数を作成しようとしています。オブジェクトとレベルを解析します。オブジェクトは、フォルダ構造またはXMLノードである可能性があります。私のコードは期待どおりに機能せず、私は助けが必要です。問題は、[int]levelとオブジェクトを再帰関数に渡すにはどうすればいいですか?奇妙なPowerShell再帰的動作


このコードは期待通りに動作します:私は、新しいパラメータを追加するとき

0 
1 
2 
3 
4 
5 

しかし、その後、$level緩いそれが機能だ:

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

それはこの出力を生成します。その価値を覚えています。私はそれが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') 

が、私はエラーを取得する:PowerShellで

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 

答えて

2

あなたがはd関数を呼び出すときに角括弧を使用しないでください。また、パラメータをカンマ区切りにしないでください。

Recurs1 -obj 'aaa' -level 0 

全体の機能:あなたは、代わりにこのようなRecurse 1呼び出すTessellatingHecklerは、彼の削除の回答で示したとおり

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

を、あなたもその位置、eでパラメータを渡すことができます。 g。

Recurs1 'aaa' 0 

ただし、パラメータ名を明示的に指定すると、スクリプトが読みやすくなると思います。