考虑示例powershell模块sample.psm1
,它导出单个变量,如下所示:
$ROOT = "C:\root"
Export-ModuleMember -Variable ROOT
可以导入指定前缀:
Import-Module .\sample.psm1 -Prefix "Sample::" -Force
尽管前缀适用于引用模块函数(例如,您现在可以执行Sample::SomeFunction
),但它似乎不适用于变量,即
$Sample::ROOT
不工作,
Sample::ROOT
,$(Sample::ROOT)
,Sample::$ROOT
,它们是导入的,只能通过全局名称(在这种情况下为$ROOT
)
在导入的变量上强制使用前缀有哪些可能的选项?处理导入变量的一般最佳做法是什么?
在模块声明中手动添加模块变量可以做到,但这对于命名空间是一种丑陋的方法
答案 0 :(得分:0)
在我看来,通常你不想从模块中导出变量,而是提供getter / setter函数,原因与.NET类通常不使用字段相同,而是属性。
如果在模块上使用Import-Module
执行-Verbose
,您会看到函数是前缀而变量不是。我认为这表明不支持变量前缀。
但是,您可以使用此代码访问 myModule 中的变量和函数:
$myMod = get-module myModule
& $myMod {$root}
这样可以访问变量&在命名变量&之前的模块中的函数模块外部的功能。 (如果使用该代码访问不在模块中但在外部作用域中的变量,则会在外部作用域中获取变量,因为模块可以访问外部作用域中的变量。)通过不导出模块变量从模块外部访问它的唯一方法是使用$myMod
进行限定。
所以不是命名空间,而是关闭。