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

时间:2016-09-10 13:20:01

标签: powershell powershell-v5.0 powershell-module

我创建了一个模块'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';

输出仍然是“做某事”

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

4 个答案:

答案 0 :(得分:41)

根据wOxxOm的建议尝试Import-Module ... -Force或者如果不起作用,请尝试使用Remove-Module明确删除它并重新导入

我刚刚创建了答案,以便在解决后可以关闭问题 - 如果wOxxOm将创建答案,我将删除此答案。

答案 1 :(得分:3)

  

导入模块'E:\ xxx.ps1'-强制

答案 2 :(得分:2)

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

似乎存在一个已知的长期错误,即导入模块的复杂程度超过基本级别(例如,我有一个单独的类和类方法无法更新的模块)。

答案 3 :(得分:1)

从我收集到的信息来看。 Import-Module不导入类。您必须使用“使用模块”,它必须在脚本的第一行中。最重要的是,这些类似乎以某种深奥的方式被“缓存”,从而排除了任何卸载模块或删除模块选项。我发现我基本上需要重新启动Powershell终端才能清除它。

如果不涉及类,请使用import-module或install-module。在这两种情况下,您都可以执行get-modules -all或get-installedmodule,然后执行remove-module或uninstall-module。您要确保查找要删除/卸载的所有版本和管道,以确保清除所有内容。