我在Windows Server 2008r2上运行64位Powershell ISE。
在调试时我设置了一个变量:
$dbName = "db1"
然后我做了以下更改
$dbName = "db2"
我再次单步执行脚本,即使调试器跨过修改后的行,当我将鼠标悬停在$ dbName变量上时,它仍显示值“db1”。我似乎可以解决这个问题的唯一方法是重启那个ISE - 这很痛苦!
有谁能告诉我哪里出错了?
*更新*
我在模块中有以下功能:
Function SampleFunction()
{
$dbName = "db1"
write-host $dbName
}
我有一个powershell脚本导入moduleL
Import-Module -Name ".\BadPsm.psm1"
在powershell ISE中,我在执行该函数之前在$ dbName =“db1”上放置一个断点,方法是在执行窗口中输入“SampleFunction”。一切都很好,值“db1”被写入输出窗口。
然后我更改了函数,以便$ dbName =“db2”。我通过再次执行Import-Module -Name“。\ BadPsm.psm1”重新导入模块。
当我再次执行该函数时,我点击断点,跳过并看到$ dbName仍然等于“db1”,“db1”也写入输出窗口。
为了帮助说明我在youtube上发布了一个简短的截屏视频:youtube link
答案 0 :(得分:6)
您的视频显示更改模块后,在再次调用import-module之前未将其卸载。为同一个模块第二次调用Import-Module什么都不做,因为它已经加载了。这就是你看到旧功能的结果的原因。
解决方案是在第二次调用Import-Module之前调用Remove-Module。或者使用Import-Module的-Force参数强制重新加载。
Import-Module -Name ".\BadPsm.psm1" -Force
退出PowerShell ISE有帮助的原因是因为你开始新鲜。它与PowerShell ISE无关。您还可以在PowerShell控制台中看到此效果。
其他人尝试过但不能重现您所看到的内容的原因是因为他们没有使用模块,因此每次更改代码时,都会运行已更改的代码。
答案 1 :(得分:0)
您可以使用Remove-Variable
cmdlet进行清理,而无需退出PowerShell ISE。您也可以简单地将变量设置为$null
,尽管它仍然存在。
$myvar = $null;
Remove-Variable -Name myvar;