5

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

在调试时,我设置了一个变量,例如:

$dbName = "db1"

然后我进行以下更改

$dbName = "db2"

我再次单步执行脚本,即使调试器跨过修改后的行,当我将鼠标悬停在 $dbName 变量上时,它仍然显示值“db1”。我似乎可以解决此问题的唯一方法是重新启动该 ISE - 这很痛苦!

谁能告诉我哪里出错了?

* 更新 *

我在模块中有以下功能:

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

我有一个导入 moduleL 的 powershell 脚本

Import-Module -Name ".\BadPsm.psm1"

在 powershell ISE 中,通过在执行窗口中输入“SampleFunction”,在执行函数之前,我在 $dbName = "db1" 上放置了一个断点。一切都很好,值“db1”被写入输出窗口。

然后我更改函数,使 $dbName = "db2"。我通过再次执行 Import-Module -Name ".\BadPsm.psm1" 重新导入模块。

当我再次执行该函数时,我遇到了断点,走过去,可以看到 $dbName 仍然等于“db1”,“db1”也被写入了输出窗口。

为了帮助说明,我在这里向 youtube 发布了一个简短的截屏视频:youtube 链接

4

2 回答 2

6

您的视频显示,在更改模块后,您在再次调用 import-module 之前没有卸载它。对同一个模块再次调用 Import-Module 不会执行任何操作,因为它已经加载。这就是为什么您会看到旧功能的结果。

解决方案是在第二次调用 Import-Module 之前调用 Remove-Module。或者使用 Import-Module 的 -Force 参数强制重新加载。

Import-Module -Name ".\BadPsm.psm1" -Force

退出 PowerShell ISE 有帮助的原因是您可以重新开始。它与 PowerShell ISE 无关。您还会在 PowerShell 控制台中看到这种效果。

其他人尝试但无法重现您所看到的原因是因为他们没有使用模块,因此每次他们更改代码时,都会运行更改后的代码。

于 2014-01-03T15:46:36.980 回答
0

您可以使用Remove-Variablecmdlet 对其进行清理,而无需退出 PowerShell ISE。您也可以简单地将变量设置为$null,尽管它仍然存在。

$myvar = $null;
Remove-Variable -Name myvar;
于 2014-01-02T19:40:36.533 回答