我需要在每个循环之间清理我的运行空间 - 如何整理我的脚本

时间:2012-03-31 18:56:47

标签: powershell

我有一个效果很好的脚本。它非常复杂并且做了很多“事情”。当我将整个1000行脚本放入while循环时,我的问题开始了。

我的一些/许多变量加倍并且每次循环都搞砸了..

这当然是因为我在相同的运行空间中运行脚本..所以,我该怎么办?在我的脚本末尾用remove-variable删除我的所有变量?或者是否有某种神奇的东西让我清除每次运行之间的运行空间?

我觉得我把事情弄得乱七八糟,我需要某种扫描仪告诉我是否有任何不需要的功能/变量。我还处于学习的早期阶段,这个脚本一直在我身边一直以来“,所以它绝不是好的编码......

那么,在我的情况下,什么是“最佳实践”?

2 个答案:

答案 0 :(得分:2)

如果每次使用干净的“范围”开始就足够了,那么试试这个:

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 :(得分:1)

您可以将以下内容添加到作业的初始化脚本中:

 $sysvars = get-variable | select -Expand name

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

然后在while循环的顶部,点源remove-uservars函数:

. remove-uservars

应该在每个循环开始之前删除脚本创建的所有变量。