我有一个效果很好的脚本。它非常复杂并且做了很多“事情”。当我将整个1000行脚本放入while循环时,我的问题开始了。
我的一些/许多变量加倍并且每次循环都搞砸了..
这当然是因为我在相同的运行空间中运行脚本..所以,我该怎么办?在我的脚本末尾用remove-variable
删除我的所有变量?或者是否有某种神奇的东西让我清除每次运行之间的运行空间?
我觉得我把事情弄得乱七八糟,我需要某种扫描仪告诉我是否有任何不需要的功能/变量。我还处于学习的早期阶段,这个脚本一直在我身边一直以来“,所以它绝不是好的编码......
那么,在我的情况下,什么是“最佳实践”?
答案 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
应该在每个循环开始之前删除脚本创建的所有变量。