2016-07-04 80 views
1

我想在PowerShell v4中創建一個遞歸函數。它會解析一個對象和一個關卡。該對象可以是文件夾結構或XML節點。我的代碼不能按預期工作,我需要幫助。問題是如何將[int]level和對象傳遞給遞歸函數?奇怪的PowerShell遞歸行爲


此代碼將如預期:

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 

回答

2

在PowerShell中你D 在調用函數時不使用括號,也不用逗號分隔參數。你不是叫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 

但是,我認爲當您明確指定參數名稱時,腳本會變得更具可讀性。