Мне нужно очистить пространство выполнения между каждым циклом - как мне привести в порядок мой скрипт - PullRequest
0 голосов
/ 31 марта 2012

У меня есть скрипт, который прекрасно работает. Он довольно сложный и выполняет множество «вещей». Моя проблема началась, когда я поместил весь 1000-строчный скрипт в цикл while.

Некоторые / многие из моих переменных удваиваются и путаются для каждого цикла.

Это, конечно, потому что я запускаю сценарий в том же пространстве выполнения .. Итак, что мне делать? Удалить все мои переменные с remove-variable в конце моего скрипта? Или есть какая-то волшебная вещь, которая позволяет мне очищать пространство между каждым прогоном?

Мне кажется, что я что-то запутал и мне нужен какой-то сканер, который сообщает мне, есть ли у меня какие-либо ненужные функции / переменные ... Я все еще на ранних этапах обучения, и этот сценарий был со мной " полностью ", так что это ни в коем случае не хорошее кодирование ..

Итак, что будет "наилучшей практикой" в моей ситуации?

Ответы [ 2 ]

2 голосов
/ 01 апреля 2012

Если начинать с чистой «области видимости» достаточно каждый раз, попробуйте следующее:

while (<loop_condition>)
{
    & {
        ... 1000 lines of script 
    }
}

Каждый раз, когда вы выполняете «1000 строк сценария» выше, вы получаете новую область видимости, поэтому переменные, локальные для этой области, должны будут повторно инициализироваться. Если ваш скрипт устанавливает глобальные переменные или переменные скрипта, например $global:foo или $script:bar, тогда этот подход может не сработать (зависит от того, хотите ли вы, чтобы глобальные / скриптовые изменения сохранялись между циклами итераций или нет).

Следующий (по общему признанию придуманный пример) демонстрирует, как создание новой области может дать вам новый набор «локальных» переменных каждый раз в цикле:

PS> while (1) { $local += 10; Start-Sleep -milli 500; $local }
10
20
30
40
PS> while (1) { & {$local += 10; Start-Sleep -milli 500; $local} }
10
10
10
10

Если вам действительно нужно совершенно новое пространство выполнения (чистый список глобальных переменных и переменных скрипта), вы можете вместо этого запустить задание, которое будет каждый раз получать новый класс пространства запуска, но результат будет не таким хорошим :

while (<loop_condition>)
{
    $job = Start-Job { <path to 1000 line script> }
    Wait-Job $job
    Receive-Job $job
}
1 голос
/ 01 апреля 2012

Вы можете добавить что-то вроде этого в скрипт инициализации для задания:

 $sysvars = get-variable | select -Expand name

  function remove-uservars {
     get-variable |
       where {$sysvars -notcontains $_.name} |
         remove-variable
    }

Затем, в верхней части цикла while, поставьте точку с помощью функции remove-uservars:

. remove-uservars

Следует удалить все переменные, созданные вашим сценарием перед началом каждого цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...