2015-03-02 3 views
1

У меня есть сценарий, который вызывает себя. Мне нужно, чтобы скрипт поддерживал переменную на том уровне, на котором она находится. Другими словами, поскольку сценарий «вырывается» из рекурсии, переменная должна быть тем, чем она была, когда она называлась.Рекурсивная переменная переменной powershell

Похоже, что область видимости переменных не позволяет этого прекрасно. Пример кода (содержащийся в Test.ps1):

param ($y) 
set-variable -name temp -scope script -value $y 

while ($continue -ne "n") 
{ 
    $temp = $temp + 1 
    $output = "Temp=" + $temp + " ::y=" + $y 
    write-host $output 
    $continue = read-host "Pause..." 
    . .\test.ps1 $temp 
} 

write-host "exiting $temp - $y" 

выход:

> PS C:\Users\evanroy\Documents\SCripts> .\test.ps1 1 
> Temp=2 ::y=1 
> Pause...: 
> Temp=3 ::y=2 
> Pause...: 
> Temp=4 ::y=3 
> Pause...: 
> Temp=5 ::y=4 
> Pause...: n 
> exiting 5 - 5 
> exiting 5 - 5 
> exiting 5 - 5 
> exiting 5 - 5 
> exiting 5 - 5 

желаемый результат:

>PS C:\Users\evanroy\Documents\SCripts> .\test.ps1 1 
>Temp=2 ::y=1 
>Pause...: 
>Temp=3 ::y=2 
>Pause...: 
>Temp=4 ::y=3 
>Pause...: 
>Temp=5 ::y=4 
>Pause...: n 
>exiting 5 - 5 
>exiting 4 - 5 
>exiting 3 - 5 
>exiting 2 - 5 
>exiting 1 - 5 

Обратите внимание, как "выход" первая переменная будет показать, что значение, когда он был первоначально назван.

ответ

1

Dot sourcing - это не то же самое, что «называть себя». Dot sourcing работает так, как если бы вы вставляли скрипт в текущую и начали его выполнять немедленно.

Вместо этого вы можете вызвать сценарий с помощью оператора &.

Вы должны тщательно прочитать about_Scopes.

+1

Или просто вызовите скрипт непосредственно, например. '. \ Test.ps1'. –

+0

doh ... Я искал другую часть и забыл, что я это сделал. Я знал, что это что-то простое, я просто не мог его увидеть ... спасибо, –

Смежные вопросы