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

Isz*_*szi 12 powershell

在 PowerShell 中,作用域应该防止脚本中的对象(变量、别名、函数等)影响全局环境。这在命令行中似乎可以正常工作,但在 ISE 中则不然。

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

在此处输入图片说明

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

在此处输入图片说明

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

在此处输入图片说明

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

这个问题的答案稍微触及了这个话题,提到了“点源”,但我希望在这里得到更彻底的解释。此外,如果存在有关脚本在 ISE 中的运行方式与控制台中运行方式不同的原因的文档,也可以提供参考。

Col*_*337 9

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

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

相关摘录:

ISE 中的所有窗格始终在同一范围内。

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

例如:

Remove-Variable x
Run Code Online (Sandbox Code Playgroud)

您可以通过单击“文件”->“新建 Powershell”选项卡将 powershell 的“干净”实例添加到 ISE