PowerShell变量与函数的加载清除机制及运行残留问题咨询
PowerShell变量与函数留存问题解答
背景
具备C#、VB编程基础,刚接触PowerShell,使用Windows PowerShell ISE开发脚本,示例代码如下:
Function Calculate-Area { [CmdletBinding()] param ( [parameter()] [int] $Length, [parameter()] [int] $Width ) Return $Length * $Width } CLS $Area = Calculate-AreaValue -Length 12 -Width 10 $Area
问题解答
问题1:首次运行脚本可得到预期结果,第二次运行若函数存在错误,$Area仍保留第一次运行的值,原因是什么?
PowerShell的变量在当前会话中是持久化存储的。当第二次运行脚本时,如果函数执行出错,$Area = Calculate-AreaValue ...这条赋值语句会执行失败,此时$Area变量不会被重新赋值,自然就保留了第一次运行时存入的旧值。
问题2:重命名函数后脚本执行失败,将函数放在脚本末尾时首次运行报错但第二次运行成功,为何PowerShell会保留之前的变量与函数?
PowerShell的会话会持续保留之前定义的所有变量和函数,除非你手动清除(比如用Remove-Variable删除变量、Remove-Item function:<函数名>删除函数)或者关闭会话。
- 当你把函数放在脚本末尾首次运行时,脚本先执行调用函数的代码,此时函数还没被定义,所以报错;但脚本会继续执行到末尾,最终还是完成了函数的定义,这个函数会被存在当前会话里。
- 第二次运行脚本时,会话中已经存在这个函数了,即使脚本里调用函数的代码在函数定义之前,PowerShell会优先使用会话中已有的函数,所以调用成功。
内容的提问来源于stack exchange,提问作者Wheels496
相关产品推荐
相关产品推荐

