Win10 1709上的PS 5.1。
这是一个悲伤,不重要的故事,但我设法覆盖了我正在修改的脚本PowerShell模块的最新源代码。但我的开放PS会话导入了最新版本;我可以看到添加的命令等。它不再同意磁盘上的源版本,即在c:\Program Files\WindowsPowershell\Modules\<modulename>
中。
我的问题是,当导入模块时,PowerShell会将加载模块的会话版本存储在某处吗?它只是在内存中(在这种情况下我运气不好),或者在某个tmp目录中?
IOW,如果c:\Program Files\WindowsPowerShell\Modules\testmod\1.0
包含模块源,我执行import-module testmod
,然后删除该testmod目录,PS会话仍然可以使用testmod,其所有命令等。是它导入的版本暂时存储在某个秘密位置,还是仅存储在内存中?
我甚至问过的原因(我认为它已经消失了,我只需要重做它)是因为我打开了另一个 PS会话并执行了get-module -ListAvailable
。有趣的是,无论如何,对我来说,它显示了我的模块的新版本,即显示新命令。但是,当我在该会话中实际导入模块时,它是旧版本(正如我所料),只有旧命令可用。
如果-ListAvailable
只显示旧命令,我会认为它已经消失,只是开始重写。但是-ListAvailable
显示新命令的事实,以及另一个会话仍然具有所有可用的新功能的事实,使我决定仅仅询问是否有机会将当前版本的源复制到某些隐藏的tmp位置。
更新: @EBGreen在评论中表示答案的大部分内容;对于导出的命令/功能,.Definition即使原始源不再可用也可以工作,例如
(Get-Module <modulename>).Definition
。
但是通过更多的在线挖掘,我也发现了查看未导出函数来源的方法。
$module.invoke( { (get-item function:<fcnname>).definition } )