Powershell 如何从模块强制导入函数,而不删除以前从模块导入的其他函数?

Powershell 如何从模块强制导入函数,而不删除以前从模块导入的其他函数?,powershell,Powershell,在PowerShell模块(父模块)中,我希望强制从另一个PowerShell模块(子模块)导入函数,而不删除以前从子模块(可能由其他父模块)导入的其他函数 复制: #childmod.psm1源代码 函数写入Foo{ 写主机“Foo” } 函数写条{ 写入主机“条” } 导出模块成员-函数* #交互式PS1会话 导入模块“/childmod.psm1”-函数“Write Foo”-强制 #这将确认“写入Foo”功能可用。 获取命令-模块“childmod” #这将删除“Write Foo”函

在PowerShell模块(父模块)中,我希望强制从另一个PowerShell模块(子模块)导入函数,而不删除以前从子模块(可能由其他父模块)导入的其他函数

复制:

#childmod.psm1源代码
函数写入Foo{
写主机“Foo”
}
函数写条{
写入主机“条”
}
导出模块成员-函数*
#交互式PS1会话
导入模块“/childmod.psm1”-函数“Write Foo”-强制
#这将确认“写入Foo”功能可用。
获取命令-模块“childmod”
#这将删除“Write Foo”函数!
导入模块“/childmod.psm1”-功能“写条”-强制
#这确认“Write Foo”功能不再可用!
获取命令-模块“childmod”
#现在,手动修改./childmod.psm1的源代码,使其输出“Foo2”而不是“Foo”。
#这将*不会*删除“书写栏”,
#但如果“Write Foo”的源代码已经更改,它也不会更新。
导入模块“/childmod.psm1”-函数“Write Foo”
#这确认了“Write Foo”和“Write Bar”功能都可用。
获取命令-模块“childmod”
#这确认了仍然使用了Write Foo的旧来源,因为将打印出“Foo”而不是“Foo2”。
写福
使用的PowerShell版本:

$pVersionTable
名称值
----                           -----
PS7.0.0版
PSEdition核心
GitCommitId 7.0.0
操作系统Microsoft Windows 10.0.18363
Win32NT平台
PSCompatibleVersions{1.0,2.0,3.0,4.0…}
PSRemotingProtocol2.3版
序列化版本1.1.0.1
WSManStack3.0版
我考虑过通过先删除函数,然后在不使用-force标志的情况下进行导入来模拟非破坏性的强制导入,但到目前为止,我还不知道如何删除单个导入的函数

处理我的用例的正确方法可能是使用嵌套模块,如中所述:

您应该避免从模块内调用
Import Module
。相反,将目标模块声明为父模块清单中的嵌套模块。声明嵌套模块提高了依赖项的可发现性

即使嵌套模块是正确的解决方案,它们也需要更多的努力。我想知道是否有更简单的解决办法

四年前的相关未回答问题:


我针对PowerShell打开的相关问题:

有什么原因不能直接导入模块吗?而不是尝试导入单个函数?我可以这样做。然而,我希望保持依赖关系的明确性和最小化。“最小依赖原则”,可以这么说:)也许您可以创建一个包装器,该包装器接受您想要的模块和cmdlet,然后首先检查是否已加载该模块,如果已加载,则检查已加载哪些命令,然后将新cmdlet添加到cmdlet列表中以加载和重新加载该模块。@Guenther是的,这当然是一个选项。不过,这需要做一些工作,我想知道是否有更简单的解决方法(除了将模块清单与嵌套模块的声明一起使用之外,这也是一个非常重要的解决方案)。有什么原因不能只导入模块吗?而不是尝试导入单个函数?我可以这样做。然而,我希望保持依赖关系的明确性和最小化。“最小依赖原则”,可以这么说:)也许您可以创建一个包装器,该包装器接受您想要的模块和cmdlet,然后首先检查是否已加载该模块,如果已加载,则检查已加载哪些命令,然后将新cmdlet添加到cmdlet列表中以加载和重新加载该模块。@Guenther是的,这当然是一个选项。不过,这将是一项工作,我想知道是否有一个更简单的解决方法(除了使用带有嵌套模块声明的模块清单之外,这也是一个非常重要的解决方案)。