【问题标题】:How do I force powershell to reload a custom module?如何强制 powershell 重新加载自定义模块?
【发布时间】:2016-09-10 13:20:00
【问题描述】:

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

输出仍然是“做某事”

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

【问题讨论】:

标签: powershell powershell-5.0 powershell-module


【解决方案1】:

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

Import-Module ... -Force

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

Remove-Module

【讨论】:

  • Import-Module -Force 似乎对类没有任何影响。我可以说没有办法“使用模块 MyModule -Force”。就像使用 C# 类执行 Add-Type 一样,它们似乎会在整个会话中持续存在。我很想知道一个方法
  • 我创建这个问题是为了解决using module 语句在更改模块后没有重新加载模块的问题。请竖起大拇指来投票。 github.com/PowerShell/PowerShell/issues/7654
  • 是的!我像个假人一样关闭了整个 Powershell 会话
【解决方案2】:

尝试以下方法:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 不幸的是我有同样的问题。我有一个带有类的模块,但它没有使用 Remove-Module、Import-Module 重新加载。我必须重新启动 PowerShell 会话才能获取更新等。可能与 matthew-heimlich 提到的问题相同
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 2012-09-17
      • 2010-11-03
      相关资源
      最近更新 更多