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

How do I force powershell to reload a custom module?

我在 powershellv5 中创建了一个包含 class 的模块 'ActiveDirectory.psm1'。我将该模块导入到另一个名为 'test.ps1' 的文件中,然后从 class.

调用一个方法

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';

输出仍然是'do something'

我猜它已经将模块存储在内存中并且没有重新加载它因此丢失了我所做的更改。我需要什么命令来 运行 加载模块的最新保存版本?

根据 wOxxOm 的建议,您可以尝试传递 -Force 标志:

Import-Module ... -Force

或者,如果这不起作用,请尝试明确删除它,然后重新导入:

Remove-Module

对于遇到此问题的任何其他人,请参阅 https://github.com/PowerShell/PowerShell/issues/2505

似乎有一个已知的长期存在的错误,涉及导入复杂度高于基本水平的模块(例如,我有一个模块只有一个 class 和 class更新失败的方法)。

尝试以下操作:

Import-Module 'E:\xxx.ps1' -Force

根据我收集到的信息。 Import-Module 不导入 类。您必须使用 "using module " 并且它必须位于脚本的第一行。最重要的是,类 似乎是 "cached" 以某种深奥的方式排除了任何卸载模块或删除模块选项。我发现我基本上需要重新启动我的 powershell 终端才能清除它。

如果 类 不涉及使用导入模块或安装模块。在这两种情况下,您都可以执行 get-modules -all 或 get-installedmodule,然后执行 remove-module 或 uninstall-module。您要确保查找所有版本并将其通过管道传输到 remove/uninstall 以确保清除所有内容。