首页 > 解决方案 > 如何从模块中公开子模块功能

问题描述

如何从子模块中公开模块中的函数和别名

profile.ps1

Import-Module module_one.psm1

module_one.psm1

Import-Module module_two.psm1:

module_two.psm1

Set-Alias readme -Value "Read-Me"
function Read-Me() {
    Write-Host "Hello..."
}
Export-ModuleMember -Function Read-Me, readme

我希望能够从 pwsh 终端、函数名或别名调用此函数?

我得到(readmeRead-Me):

自述文件:术语“自述文件”未被识别为 cmdlet 的名称,
函数、脚本文件或可运行的程序。检查名字的拼写,
或者如果包含路径,请验证路径是否正确并重试。
在行:1 字符:1
+ 合作
+ ~~
    + CategoryInfo : ObjectNotFound: (co:String) [], CommandNotFoundException
    +fullyQualifiedErrorId:CommandNotFoundException

注意:它适用于module_one.psm1.

标签: powershell

解决方案


假设您在同一个作用域域(模块外部或来自同一(其他)模块)中调用Import-Module module_one.psm1和稍后readme/ ,您的代码原则上可以工作:Read-Me

间接导入模块的导出元素(也)被导入调用者作用域的顶级作用域。

您的问题是您正在尝试将别名 readme导出为函数;您需要改用单独的
-Alias参数

Export-ModuleMember -Function Read-Me -Alias readme # Note the -Alias parameter

另请注意,在没有Export-ModuleMember调用的情况下,默认导出的是所有顶级)函数和别名(但不是变量)因此您的特定情况下,只需省略调用也可以解决问题。

不过,一般来说,最好明确导出哪些元素,最好通过一个完整的模块来完成,该模块不仅仅是一个文件,而是一个以模块命名*.psm1的整个目录*.psm1,文件包含一个关联的模块清单,这是一个*.psd1描述模块的文件,特别是在它的导出方面。
如果这样的模块被放置在 中列出的目录之一中$env:PSModulePath,甚至可以在导入模块之前发现其导出的命令(例如,使用Get-Command或 tab-completion),通过称为自动加载的功能- 请参阅about_Modules


请注意,这Import-Module -Global很少需要并且通常应该避免,因为它使模块的导出元素也可用于所有加载的模块,这可能会产生意想不到的副作用(模块应该显式声明它们的依赖项)。


推荐阅读