gpt4 book ai didi

powershell - 每次执行脚本时重新加载 PowerShell 模块

转载 作者:行者123 更新时间:2023-12-04 12:33:11 24 4
gpt4 key购买 nike

我在 PowerShell 模块文件中有一个类。 ( A.psm1 )

class A  {

[void] printString() {
write-host 111
}

}
而且我还有一个使用该类的简单脚本。
Using module C:\temp\A.psm1

$a = [A]::new()
$a.printString() # prints 111
但是,如果我从类中更改方法,例如,如此处所示(替换 111 on 222 )
[void] printString() {
write-host 222
}
如果我重新启动我的脚本,它仍然会打印 111 .只有当我重新启动 PowerShell 控制台时,它才会打印新值。
如果我只在控制台中工作,我可以使用 Import-Module ... -Force命令。但它在脚本中不起作用。
那么有没有办法在每次启动脚本时重新加载 PowerShell 模块而无需重新启动控制台本身?

最佳答案

这种不幸的行为是 well-known issue , 和 as mklement0 points out没有真正的目前存在解决方案。
根本原因有点令人费解(部分原因是该行为在 5 年以上后仍然存在),但基本上是以下三个方面的冲突:

  • PowerShell 中的模块生命周期管理(模块应该是可重新加载的)
  • .NET 中的类型定义生命周期管理(在进程的生命周期内,类型永远不能“未定义”*)
  • 方式using module提供自定义类型的解析时间解析 - 说白了这不是一个特别成熟的功能

  • 虽然没有好的解决方案,但 VSCode PowerShell 扩展有一个配置选项 allowing you to run debug sessions in a temporary shell ,使它成为一个非问题:
    enter image description here
    {
    "powershell.debugging.createTemporaryIntegratedConsole": true
    }
    设置后,您可以使用以下工作流程进行测试/调试:
  • 在编辑器中打开脚本
  • 通过调试器运行它 ( Shift+Ctrl+D -> Run and Debug )
  • 关注 printString()版画 111
  • 修改模块文件,保存
  • 再次通过调试器运行脚本
  • 关注 printString()现在打印新值
  • 关于powershell - 每次执行脚本时重新加载 PowerShell 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67027886/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com