Powershell ISE如何缓存变量值?

5

我是在 Windows Server 2008r2 上运行 64 位 Powershell ISE。

在调试过程中,我设置了一个变量,例如:

$dbName = "db1"

我接下来做以下更改。
$dbName = "db2"

我再次逐步执行脚本,尽管调试器跳过了修改后的行,但当我悬停在 $dbName 变量上时,它仍然显示值为 "db1"。我似乎唯一可以解决这个问题的方法是重新启动 ISE - 这很麻烦!

请问有人能告诉我我错在哪里吗?

* 更新 *

我在一个模块中有以下函数:

Function SampleFunction()
{
    $dbName = "db1"
    write-host $dbName
}

我有一个导入模块L的powershell脚本。
Import-Module -Name ".\BadPsm.psm1"

我在PowerShell ISE中,在执行窗口中输入“SampleFunction”之前,在 $dbName = "db1" 上设置断点。一切都很好,值“db1”被写入输出窗口。
然后我更改了函数,使 $dbName = "db2"。我重新通过执行 Import-Module -Name ".\BadPsm.psm1" 导入模块。
当我再次执行该函数时,我遇到断点,跳过并可以看到 $dbName 仍然等于“db1”,“db1”也被写入输出窗口。
为了帮助说明,我在YouTube上发布了一个短片段,这里是链接: youtube link

1
你能告诉我们你遵循的步骤来解决这个问题吗?我已经尝试过了,但似乎无法重现这个问题。最接近的情况是在调试时,它短暂地显示旧值,1秒后刷新以显示新值。 - HAL9256
1
我无法使用当前的示例重现您的问题,但听起来像是变量作用域问题。请提供一个剥离了敏感信息的脚本副本。 - Frode F.
如果您运行脚本而不使用调试器会发生什么? - Jimbo
如果我没记错,按 F5 可以在当前作用域运行脚本。尝试通过键入脚本名称来运行它,看看问题是否仍然存在。 - Bill_Stewart
请查看我在YouTube上发布的屏幕录像,展示了这个问题。 - Rob Bowman
2个回答

6
你的视频显示,在调用 import-module 命令之前,你没有卸载之前的模块。如果已经加载了同一个模块,再次调用 import-module 命令将不会有任何作用。这就是为什么你看到的是旧函数的结果。
解决方法是在第二次调用 import-module 命令之前调用 Remove-Module 命令来卸载模块。或者使用 import-module 命令的 -Force 参数来强制重新加载。
Import-Module -Name ".\BadPsm.psm1" -Force

退出PowerShell ISE的原因是为了重新开始。这与PowerShell ISE无关。您在PowerShell控制台中也会看到此效果。
其他人尝试但无法复制您所看到的原因是因为他们没有使用模块,因此每次更改代码时都会运行更改后的代码。

就是这样!当我在Import-Module的末尾添加了-Force时,它可以正常工作。非常感谢Lars,这个问题困扰了我很长时间。 - Rob Bowman

0

您可以使用Remove-Variable cmdlet来清除它,而无需退出PowerShell ISE。您也可以将变量简单地设置为$null,尽管它仍然存在。

$myvar = $null;
Remove-Variable -Name myvar;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接