2016-07-04 1 views
1

Я пытаюсь создать рекурсивную функцию в PowerShell v4. Он будет анализировать объект и уровень. Объектом может быть структура папок или узел XML. Мой код работает не так, как ожидалось, и мне нужна помощь. Вопрос в том, как я могу передать [int]level и объект рекурсивной функции?Strange 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 показал в своем удаляемого ответ, вы можете также передать параметр его положение, е , г.

Recurs1 'aaa' 0 

Однако, я думаю, что ваш скрипт становится более читаемым, когда вы явно указываете имена параметров.