如何从子模块中公开模块中的函数和别名
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终端,函数名称或别名调用此函数吗?
我得到(readme
或Read-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
中的功能。
答案 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
很少需要,一般应避免使用,因为它使模块的导出元素也可用于所有已加载的模块,这可能会产生意想不到的副作用(模块应声明明确显示其依赖性)。