Powershell导入模块:导入变量的前缀
考虑示例powershell模块Powershell导入模块:导入变量的前缀,powershell,Powershell,考虑示例powershell模块sample.psm1,它导出单个变量,如下所示: $ROOT = "C:\root" Export-ModuleMember -Variable ROOT 可以通过指定前缀来导入: Import-Module .\sample.psm1 -Prefix "Sample::" -Force 尽管前缀可以很好地用于引用模块函数(例如,您现在可以执行Sample::SomeFunction),但它似乎不适用于变量,即 $Sample::ROOT不起作用,也不起作用
sample.psm1
,它导出单个变量,如下所示:
$ROOT = "C:\root"
Export-ModuleMember -Variable ROOT
可以通过指定前缀来导入:
Import-Module .\sample.psm1 -Prefix "Sample::" -Force
尽管前缀可以很好地用于引用模块函数(例如,您现在可以执行Sample::SomeFunction
),但它似乎不适用于变量,即
$Sample::ROOT
不起作用,也不起作用
Sample::ROOT
$(示例::ROOT)
示例::$ROOT
$ROOT
)
在导入的变量上强制使用前缀的可能选项有哪些?处理导入变量的一般最佳实践是什么
在模块声明中手动为模块变量添加前缀也可以,但在我看来,这是一种难看的命名空间方法,通常您不想从模块中导出变量,而是提供getter/setter函数,原因与.NET类通常不使用字段,而是使用属性相同 如果在模块上使用
-Verbose
执行导入模块
,您将看到函数带有前缀,变量没有前缀。我认为这是一个强烈的迹象,表明变量上的前缀不受支持
但是,您可以使用此代码访问myModule中的变量和函数:
这样就可以在模块外部类似命名变量和函数之前访问模块中的变量和函数。(如果您使用该代码访问的变量不是模块中的变量,而是外部作用域中的变量,那么您将在外部作用域中获取该变量,因为模块可以访问外部作用域中的变量。)通过不导出模块变量,从模块外部访问该变量的唯一方法是使用$myMod
对其进行限定
因此,不是一个名称空间,而是一个封闭的名称空间。在我看来,通常您不希望从模块导出变量,而是提供getter/setter函数,原因与.NET类通常不使用字段,而是使用属性相同 如果在模块上使用
-Verbose
执行导入模块
,您将看到函数带有前缀,变量没有前缀。我认为这是一个强烈的迹象,表明变量上的前缀不受支持
但是,您可以使用此代码访问myModule中的变量和函数:
这样就可以在模块外部类似命名变量和函数之前访问模块中的变量和函数。(如果您使用该代码访问的变量不是模块中的变量,而是外部作用域中的变量,那么您将在外部作用域中获取该变量,因为模块可以访问外部作用域中的变量。)通过不导出模块变量,从模块外部访问该变量的唯一方法是使用$myMod
对其进行限定
所以不是一个很好的名称空间,但是很接近
$myMod = get-module myModule
& $myMod {$root}