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

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

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

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

在此处输入图片描述

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

在此处输入图片描述

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

在此处输入图片描述

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

回答这个问题稍微触及了主题,提到了“点源”,但我希望在这里得到更详尽的解释。此外,如果有文档说明为什么脚本在 ISE 中的运行方式与在控制台中的运行方式不同,那么参考资料也很好。

答案1

在您的脚本示例中,您创建了变量,但并未在脚本末尾销毁它们。ISE 会创建一个实时的 powershell 实例,当您单击“运行”时,该实例会加载并运行脚本。不同之处在于集成的 shell 可以继续执行脚本。这对于调试环境和随时创建脚本非常理想。这样,您就不必一遍又一遍地运行脚本(在某些情况下,这样做并不理想)来确保下一行代码有效。您可以在 shell 中输入它,如果有效,则将其添加到脚本部分。

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

相关摘录:

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

如果您不希望变量在脚本完成后仍保留在 shell 中,那么您应该保留Remove-Variable它们。

例如:

Remove-Variable x

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

答案2

在 ISE 中,Powershell 本质上是将脚本转储到 shell 然后运行它。就像您在 shell 中输入它然后执行它一样。因此该变量可用于该会话。要查看其他差异,请查看此微软邮政。

答案3

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

相关内容