我有一个很好的剧本。它相当复杂,做了许多“事情”。我的问题是当我把整个1000行脚本放到一个时间循环中时.
我的一些/许多变量是加倍的,每个循环都搞砸了..
这当然是因为我在同一个运行空间中运行脚本。那我该怎么办?在脚本末尾用remove-variable
删除所有变量?还是有什么神奇的东西可以让我在每一次跑步之间清理我的运行空间?
我觉得我把事情弄得乱七八糟,我需要某种扫描仪来告诉我是否有任何不必要的元素/变量。我还在学习的早期阶段,这个剧本一直伴随着我“一路”,所以它绝不是好的编码。
那么,在我的情况下,什么才是“最佳实践”呢?
发布于 2012-03-31 19:13:52
可以将类似的内容添加到作业的初始化脚本中:
$sysvars = get-variable | select -Expand name
function remove-uservars {
get-variable |
where {$sysvars -notcontains $_.name} |
remove-variable
}
然后在while循环的顶部,点源remove-uservars函数:
. remove-uservars
应该删除脚本在每个循环开始之前创建的所有变量。
发布于 2012-03-31 14:03:06
如果每次从干净的“作用域”开始就足够了,那么尝试如下:
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
如果您真的需要一个全新的运行空间(干净的全局变量和脚本变量),那么您可以开始一个作业,这将使您每次在循环中都有一个新的运行空间,但是perf并不是那么好:
while (<loop_condition>)
{
$job = Start-Job { <path to 1000 line script> }
Wait-Job $job
Receive-Job $job
}
https://stackoverflow.com/questions/9958740
复制相似问题