为什么PowerShell ISE不将脚本变量与脚本范围隔离?


12

在PowerShell中,作用域应该使脚本中的对象(变量,别名,函数等)不会影响全局环境。这似乎在命令行中正常工作,但在ISE中没有。

这是控制台中的演示。我检查一下 $x 未在全局范围内定义,显示内容 ScopeTest.ps1 然后运行它,最后我检查是否 $x 再次定义。正如所料, $x 仅在脚本范围内创建和使用,并且在脚本终止后不会在全局环境中保留。

enter image description here

在ISE中,如果使用控制台窗口调用脚本,这似乎有效。

enter image description here

但是,如果我实际使用“运行脚本”按钮或F5,脚本中的变量将在完成后保留。

enter image description here

如果脚本假定它将从一个干净的环境开始(即:脚本中设置的任何变量都不应该存在),这可能会使编写和故障排除脚本变得有点困难。为什么ISE会以这种方式运作?

答案 这个问题 稍微谈到这个话题,提到“点源”,但我希望在这里得到更全面的解释。此外,如果存在关于脚本在ISE中以不同方式运行而不是从控制台运行的原因的文档,那么引用也会很好。

Answers:


9

在您的脚本示例中,您创建了变量,并且在脚本末尾没有销毁它们。 ISE创建powershell的实例,在您单击运行时加载并运行脚本。不同之处在于集成shell可以继续脚本。这是调试环境和创建脚本的理想选择。这样您就不必一遍又一遍地运行脚本(有些情况下这并不理想),以确保下一行代码能够正常工作。您在shell中键入它,如果它工作,您将它添加到脚本部分。

这种行为可能在这里描述得最好: http://technet.microsoft.com/en-us/library/dd819480.aspx

相关摘录:

ISE中的所有窗格始终处于相同的范围内。

如果您不希望在脚本完成后您的变量存在于shell中,那么您应该这样做 Remove-Variable 他们。

例如:

Remove-Variable x

您可以通过单击File-> New Powershell选项卡向ISE添加一个“干净”的powershell实例


2

在ISE中,Powershell实际上是将脚本转储到shell然后运行它。就像你在shell中输入它一样,然后执行它。因此该变量可用于该会话。要查看其他差异,请查看此信息 MSDN 帖子。


我没有在链接的帖子中看到任何解决此问题的内容。
Iszi

0

所以ISE就像全球一样。除非删除在ISE中工作时创建的所有变量,否则所有变量在脚本运行后都可用。当我使用ISE构建我的脚本时,我将始终使用不同的PowerShell控制台进行测试。这使我能够确保一切按预期工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.