【问题标题】:Powershell ISE caching variable values?Powershell ISE缓存变量值?
【发布时间】:2014-01-20 07:11:54
【问题描述】:

我在 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 中,我在 $dbName = "db1" 上放置一个断点,然后在执行窗口中输入“SampleFunction”来执行该函数。一切正常,值“db1”被写入输出窗口。

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

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

为了帮助说明,我在 youtube 上发布了一个简短的截屏视频:youtube link

【问题讨论】:

  • 您能告诉我们您解决问题所遵循的步骤吗?我已经尝试过了,我似乎无法重新创建问题。我得到的最接近的是在调试时,它会短暂显示旧值,并在 1 秒后刷新以显示新值。
  • 我无法使用当前示例重现您的问题,但这听起来像是一个变量范围问题。请提供脚本的精简(删除敏感信息)副本。
  • 如果您运行脚本而不是使用调试器会发生什么?
  • IIRC F5 在当前范围内运行脚本。尝试通过键入脚本名称来运行脚本,然后查看问题是否仍然存在。
  • 请看我发布到 youtube 上的截屏视频来说明问题。

标签: powershell powershell-ise


【解决方案1】:

您的视频显示,在更改模块后,您在再次调用 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,这一直困扰着我很长时间
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 2022-11-10
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    相关资源
    最近更新 更多