如何强制PowerShell重新加载自定义模块?

81

我已经创建了一个名为'ActiveDirectory.psm1'的模块,其中包含一个powershellv5类。我在另一个名为'test.ps1'的文件中导入该模块,然后从该类调用一个方法。

'test.ps1'文件包含以下内容:

using module '\\ser01\Shared\Scripts\Windows Powershell\modules\ActiveDirectory\ActiveDirectory.psm1'

Set-StrictMode -version Latest;

$AD = [ActiveDirectory]::New('CS');
$AD.SyncGroupMembership($True);

所有的工作都按预期进行,但是当我对ActiveDirectory.psm1进行更改并保存更改时,更改不会立即反映出来。也就是说,如果ActiveDirectory.psm1包含:

write-verbose 'do something';

如果我将其更改为

write-verbose 'now the script does something else';

输出仍然是“做一些事情”。

我猜测它已经将模块存储在内存中,并且没有重新加载它,因此错过了我所做的更改。我需要运行哪个命令以加载最近保存的模块版本?


13
也许是Import-Module ActiveDirectory -force?参见Powershell:编辑已导入的模块 - wOxxOm
1
我创建了这个问题来解决“使用模块”语句在对其进行更改后未重新加载模块的问题。请点赞以支持它。https://github.com/PowerShell/PowerShell/issues/7654 - deadlydog
可能是编辑已导入模块的问题的重复。 - Micha Wiedenmann
3个回答

112

wOxxOm 建议的那样,您可以尝试使用 -Force 标志:

Import-Module ... -Force

如果那不起作用,尝试显式地将其删除,然后重新导入:

Remove-Module

2
Import-Module -Force 对类似的东西似乎没有任何影响。 我不知道有什么办法可以像使用C#类的Add-Type一样,使用“using module MyModule -Force”。它们似乎会持续整个会话。我很想知道有什么解决方法。 - Dave_J
我创建了这个问题来解决“使用模块”语句在对其进行更改后未重新加载模块的问题。请点赞以支持它。https://github.com/PowerShell/PowerShell/issues/7654 - deadlydog
是的!! 我像个傻瓜一样关闭了整个PowerShell会话。 - Kellen Stuart

6
据我所了解,Import-Module命令不会导入类。你需要使用"using module "命令,并且它必须在脚本的第一行。此外,这些类似乎以某种神秘的方式被“缓存”,这使得任何uninstall-module或remove-module选项无法删除它们。我发现只有通过重新启动我的powershell终端才能清除它们。
如果没有涉及类,则使用import-module或install-module命令。在两种情况下,您都可以执行get-modules -all或get-installedmodule命令,然后将其管道到remove/uninstall中,以确保彻底清除所有版本。

1
不幸的是,我有同样的问题。 我有一个带有类的模块,但它在使用Remove-Module,Import-Module重新加载时无法更新。 我必须重新启动PowerShell会话才能获取更新等。 可能与matthew-heimlich提到的问题相同。 - Maximojo

4
对于遇到这个问题的其他人,请参见https://github.com/PowerShell/PowerShell/issues/2505 似乎已知存在一个长期的错误,涉及导入比基本级别复杂的模块(例如,我有一个包含单个类和类方法的模块无法更新)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接