如何从模块公开子模块功能

时间:2019-07-24 11:22:16

标签: powershell

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

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):

Read-Me : The term 'Read-Me' is not recognized as the name of a cmdlet,
function, script file, or operable program. Check the spelling of the name,
or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ co
+ ~~
    + CategoryInfo          : ObjectNotFound: (co:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

注意:它适用于module_one.psm1中的功能。

1 个答案:

答案 0 :(得分:2)

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

(也)将间接导入模块的导出元素导入到调用方作用域的顶级作用域中。

您的问题是您试图将别名 readme导出为 function ;您需要使用单独的
-Alias参数

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

还要注意,在Export-ModuleMember调用的不存在中,它是 all (顶级)函数和别名(而不是变量< / em>)(默认情况下 导出),因此在您的特定情况下,只需省略该调用也可以解决此问题。

但是,一般来说,最好明确说明导出哪些元素,最好通过功能强大的模块完成,而不仅仅是一个*.psm1文件,但为该模块命名的整个目录,其中包含*.psm1文件以及相关的 module清单,该文件是一个*.psd1文件,描述了模块,尤其是在出口方面。
如果将这样的模块放置在$env:PSModulePath中列出的目录之一中,则即使在导入模块之前,也可以通过以下功能发现其导出的命令(例如,使用Get-Command或制表符完成) 自动加载-请参见about_Modules


请注意, Import-Module -Global很少需要,一般应避免使用,因为它使模块的导出元素也可用于所有已加载的模块,这可能会产生意想不到的副作用(模块应声明明确显示其依赖性)。